ITK
4.1.0
Insight Segmentation and Registration Toolkit
|
00001 /*========================================================================= 00002 * 00003 * Copyright Insight Software Consortium 00004 * 00005 * Licensed under the Apache License, Version 2.0 (the "License"); 00006 * you may not use this file except in compliance with the License. 00007 * You may obtain a copy of the License at 00008 * 00009 * http://www.apache.org/licenses/LICENSE-2.0.txt 00010 * 00011 * Unless required by applicable law or agreed to in writing, software 00012 * distributed under the License is distributed on an "AS IS" BASIS, 00013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00014 * See the License for the specific language governing permissions and 00015 * limitations under the License. 00016 * 00017 *=========================================================================*/ 00018 #ifndef __itkVectorContainer_h 00019 #define __itkVectorContainer_h 00020 00021 #include "itkObject.h" 00022 #include "itkObjectFactory.h" 00023 00024 #include <utility> 00025 #include <vector> 00026 00027 namespace itk 00028 { 00047 template< 00048 typename TElementIdentifier, 00049 typename TElement 00050 > 00051 class ITK_EXPORT VectorContainer: 00052 public Object, 00053 private std::vector< TElement > 00054 { 00055 public: 00057 typedef VectorContainer Self; 00058 typedef Object Superclass; 00059 typedef SmartPointer< Self > Pointer; 00060 typedef SmartPointer< const Self > ConstPointer; 00061 00063 typedef TElementIdentifier ElementIdentifier; 00064 typedef TElement Element; 00065 private: 00066 00068 typedef std::vector< Element > VectorType; 00069 typedef typename VectorType::size_type size_type; 00070 typedef typename VectorType::iterator VectorIterator; 00071 typedef typename VectorType::const_iterator VectorConstIterator; 00072 protected: 00073 00077 VectorContainer(): 00078 Object(), VectorType() {} 00079 VectorContainer(size_type n): 00080 Object(), VectorType(n) {} 00081 VectorContainer(size_type n, const Element & x): 00082 Object(), VectorType(n, x) {} 00083 VectorContainer(const Self & r): 00084 Object(), VectorType(r) {} 00085 template< typename TInputIterator > 00086 VectorContainer(TInputIterator first, TInputIterator last): 00087 Object(), VectorType(first, last) {} 00088 public: 00090 00092 typedef VectorType STLContainerType; 00093 00095 itkNewMacro(Self); 00096 00098 itkTypeMacro(VectorContainer, Object); 00099 00101 class Iterator; 00102 class ConstIterator; 00103 00105 STLContainerType & CastToSTLContainer() 00106 { 00107 return dynamic_cast< STLContainerType & >( *this ); 00108 } 00109 00111 const STLContainerType & CastToSTLConstContainer() const 00112 { 00113 return dynamic_cast< const STLContainerType & >( *this ); 00114 } 00115 00116 using STLContainerType::begin; 00117 using STLContainerType::end; 00118 using STLContainerType::rbegin; 00119 using STLContainerType::rend; 00120 00121 using STLContainerType::size; 00122 using STLContainerType::max_size; 00123 using STLContainerType::resize; 00124 using STLContainerType::capacity; 00125 using STLContainerType::empty; 00126 using STLContainerType::reserve; 00127 00128 using STLContainerType::operator[]; 00129 using STLContainerType::at; 00130 using STLContainerType::front; 00131 using STLContainerType::back; 00132 00133 using STLContainerType::assign; 00134 using STLContainerType::push_back; 00135 using STLContainerType::pop_back; 00136 using STLContainerType::insert; 00137 using STLContainerType::erase; 00138 using STLContainerType::swap; 00139 using STLContainerType::clear; 00140 00141 using STLContainerType::get_allocator; 00142 00143 using typename STLContainerType::reference; 00144 using typename STLContainerType::const_reference; 00145 using typename STLContainerType::iterator; 00146 using typename STLContainerType::const_iterator; 00147 // already declared before 00148 // using STLContainerType::size_type; 00149 using typename STLContainerType::difference_type; 00150 using typename STLContainerType::value_type; 00151 using typename STLContainerType::allocator_type; 00152 using typename STLContainerType::pointer; 00153 using typename STLContainerType::const_pointer; 00154 using typename STLContainerType::reverse_iterator; 00155 using typename STLContainerType::const_reverse_iterator; 00156 00158 friend class Iterator; 00159 friend class ConstIterator; 00160 00166 class Iterator 00167 { 00168 public: 00169 Iterator() {} 00170 Iterator(size_type d, const VectorIterator & i):m_Pos(d), m_Iter(i) {} 00171 Iterator & operator*() { return *this; } 00172 Iterator * operator->() { return this; } 00173 Iterator & operator++() { ++m_Pos; ++m_Iter; return *this; } 00174 Iterator operator++(int) { Iterator temp(*this); ++m_Pos; ++m_Iter; return temp; } 00175 Iterator & operator--() { --m_Pos; --m_Iter; return *this; } 00176 Iterator operator--(int) { Iterator temp(*this); --m_Pos; --m_Iter; return temp; } 00177 bool operator==(const Iterator & r) const { return m_Iter == r.m_Iter; } 00178 bool operator!=(const Iterator & r) const { return m_Iter != r.m_Iter; } 00179 bool operator==(const ConstIterator & r) const { return m_Iter == r.m_Iter; } 00180 bool operator!=(const ConstIterator & r) const { return m_Iter != r.m_Iter; } 00181 00184 ElementIdentifier Index(void) const { return static_cast< ElementIdentifier >( m_Pos ); } 00185 00187 Element & Value(void) const { return *m_Iter; } 00188 private: 00189 size_type m_Pos; 00190 VectorIterator m_Iter; 00191 friend class ConstIterator; 00192 }; 00193 00199 class ConstIterator 00200 { 00201 public: 00202 ConstIterator() {} 00203 ConstIterator(size_type d, const VectorConstIterator & i):m_Pos(d), m_Iter(i) {} 00204 ConstIterator(const Iterator & r) { m_Pos = r.m_Pos; m_Iter = r.m_Iter; } 00205 ConstIterator & operator*() { return *this; } 00206 ConstIterator * operator->() { return this; } 00207 ConstIterator & operator++() { ++m_Pos; ++m_Iter; return *this; } 00208 ConstIterator operator++(int) { ConstIterator temp(*this); ++m_Pos; ++m_Iter; return temp; } 00209 ConstIterator & operator--() { --m_Pos; --m_Iter; return *this; } 00210 ConstIterator operator--(int) { ConstIterator temp(*this); --m_Pos; --m_Iter; return temp; } 00211 ConstIterator & operator=(const Iterator & r) { m_Pos = r.m_Pos; m_Iter = r.m_Iter; return *this; } 00212 bool operator==(const Iterator & r) const { return m_Iter == r.m_Iter; } 00213 bool operator!=(const Iterator & r) const { return m_Iter != r.m_Iter; } 00214 bool operator==(const ConstIterator & r) const { return m_Iter == r.m_Iter; } 00215 bool operator!=(const ConstIterator & r) const { return m_Iter != r.m_Iter; } 00216 00219 ElementIdentifier Index(void) const { return static_cast< ElementIdentifier >( m_Pos ); } 00220 00222 const Element & Value(void) const { return *m_Iter; } 00223 private: 00224 size_type m_Pos; 00225 VectorConstIterator m_Iter; 00226 friend class Iterator; 00227 }; 00228 00229 /* Declare the public interface routines. */ 00230 00239 Element & ElementAt(ElementIdentifier); 00240 00247 const Element & ElementAt(ElementIdentifier) const; 00248 00257 Element & CreateElementAt(ElementIdentifier); 00258 00263 Element GetElement(ElementIdentifier) const; 00264 00269 void SetElement(ElementIdentifier, Element); 00270 00276 void InsertElement(ElementIdentifier, Element); 00277 00282 bool IndexExists(ElementIdentifier) const; 00283 00289 bool GetElementIfIndexExists(ElementIdentifier, Element *) const; 00290 00296 void CreateIndex(ElementIdentifier); 00297 00303 void DeleteIndex(ElementIdentifier); 00304 00308 ConstIterator Begin(void) const; 00309 00313 ConstIterator End(void) const; 00314 00318 Iterator Begin(void); 00319 00323 Iterator End(void); 00324 00328 ElementIdentifier Size(void) const; 00329 00339 void Reserve(ElementIdentifier); 00340 00347 void Squeeze(void); 00348 00352 void Initialize(void); 00353 }; 00354 } // end namespace itk 00355 00356 // Define instantiation macro for this template. 00357 #define ITK_TEMPLATE_VectorContainer(_, EXPORT, TypeX, TypeY) \ 00358 namespace itk \ 00359 { \ 00360 _( 2 ( class EXPORT VectorContainer< ITK_TEMPLATE_2 TypeX > ) ) \ 00361 namespace Templates \ 00362 { \ 00363 typedef VectorContainer< ITK_TEMPLATE_2 TypeX > \ 00364 VectorContainer##TypeY; \ 00365 } \ 00366 } 00367 00368 #if ITK_TEMPLATE_EXPLICIT 00369 #include "Templates/itkVectorContainer+-.h" 00370 #endif 00371 00372 #if ITK_TEMPLATE_TXX 00373 #include "itkVectorContainer.hxx" 00374 #endif 00375 00376 #endif 00377