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 __itkMapContainer_h 00019 #define __itkMapContainer_h 00020 00021 #include "itkObject.h" 00022 #include "itkObjectFactory.h" 00023 00024 #include <map> 00025 00026 namespace itk 00027 { 00044 template< typename TElementIdentifier, typename TElement > 00045 class MapContainer: 00046 public Object, 00047 private std::map< TElementIdentifier, TElement > 00048 { 00049 public: 00051 typedef MapContainer Self; 00052 typedef Object Superclass; 00053 typedef SmartPointer< Self > Pointer; 00054 typedef SmartPointer< const Self > ConstPointer; 00055 00057 itkTypeMacro(MapContainer, Object); 00058 00060 typedef TElementIdentifier ElementIdentifier; 00061 typedef TElement Element; 00062 private: 00063 MapContainer(const Self &); //purposely not implemented 00064 void operator=(const Self &); //purposely not implemented 00066 00068 typedef std::map< ElementIdentifier, Element > MapType; 00069 typedef typename MapType::iterator MapIterator; 00070 typedef typename MapType::const_iterator MapConstIterator; 00071 typedef typename MapType::key_compare MapKeyCompareType; 00072 public: 00073 00077 MapContainer():MapType() {} 00078 MapContainer(const MapKeyCompareType & comp):MapType(comp) {} 00079 // MapContainer(const Self& r):MapType(r) {} 00080 template< typename TInputIterator > 00081 MapContainer(TInputIterator first, TInputIterator last):MapType(first, last) {} 00082 template< typename TInputIterator > 00083 MapContainer(TInputIterator first, TInputIterator last, const MapKeyCompareType & comp): 00084 MapType(first, last, comp) {} 00086 00088 itkNewMacro(Self); 00089 00091 typedef MapType STLContainerType; 00092 00094 STLContainerType & CastToSTLContainer() 00095 { return dynamic_cast< STLContainerType & >( *this ); } 00096 00098 const STLContainerType & CastToSTLConstContainer() const 00099 { 00100 return dynamic_cast< const STLContainerType & >( *this ); 00101 } 00102 00103 using STLContainerType::begin; 00104 using STLContainerType::end; 00105 using STLContainerType::rbegin; 00106 using STLContainerType::rend; 00107 00108 using STLContainerType::empty; 00109 using STLContainerType::size; 00110 using STLContainerType::max_size; 00111 00112 using STLContainerType::operator[]; 00113 00114 using STLContainerType::insert; 00115 using STLContainerType::erase; 00116 using STLContainerType::swap; 00117 using STLContainerType::clear; 00118 00119 using STLContainerType::key_comp; 00120 using STLContainerType::value_comp; 00121 00122 using STLContainerType::find; 00123 using STLContainerType::count; 00124 using STLContainerType::lower_bound; 00125 using STLContainerType::upper_bound; 00126 using STLContainerType::equal_range; 00127 00128 using STLContainerType::get_allocator; 00129 00130 using typename STLContainerType::key_type; 00131 using typename STLContainerType::mapped_type; 00132 using typename STLContainerType::value_type; 00133 using typename STLContainerType::key_compare; 00134 using typename STLContainerType::value_compare; 00135 using typename STLContainerType::allocator_type; 00136 using typename STLContainerType::reference; 00137 using typename STLContainerType::const_reference; 00138 using typename STLContainerType::iterator; 00139 using typename STLContainerType::const_iterator; 00140 using typename STLContainerType::size_type; 00141 using typename STLContainerType::difference_type; 00142 using typename STLContainerType::pointer; 00143 using typename STLContainerType::const_pointer; 00144 using typename STLContainerType::reverse_iterator; 00145 using typename STLContainerType::const_reverse_iterator; 00146 00148 class Iterator; 00149 class ConstIterator; 00150 friend class Iterator; 00151 friend class ConstIterator; 00152 00157 class Iterator 00158 { 00159 public: 00160 Iterator() {} 00161 Iterator(const MapIterator & i):m_Iter(i) {} 00162 00163 Iterator & operator*() { return *this; } 00164 Iterator * operator->() { return this; } 00165 Iterator & operator++() { ++m_Iter; return *this; } 00166 Iterator operator++(int) { Iterator temp(*this); ++m_Iter; return temp; } 00167 Iterator & operator--() { --m_Iter; return *this; } 00168 Iterator operator--(int) { Iterator temp(*this); --m_Iter; return temp; } 00169 00170 bool operator==(const Iterator & r) const { return m_Iter == r.m_Iter; } 00171 bool operator!=(const Iterator & r) const { return m_Iter != r.m_Iter; } 00172 bool operator==(const ConstIterator & r) const { return m_Iter == r.m_Iter; } 00173 bool operator!=(const ConstIterator & r) const { return m_Iter != r.m_Iter; } 00174 00176 ElementIdentifier Index(void) const { return m_Iter->first; } 00177 00179 Element & Value(void) { return m_Iter->second; } 00180 private: 00181 MapIterator m_Iter; 00182 friend class ConstIterator; 00183 }; 00184 00189 class ConstIterator 00190 { 00191 public: 00192 ConstIterator() {} 00193 ConstIterator(const MapConstIterator & ci):m_Iter(ci) {} 00194 ConstIterator(const Iterator & r) { m_Iter = r.m_Iter; } 00195 00196 ConstIterator & operator*() { return *this; } 00197 ConstIterator * operator->() { return this; } 00198 ConstIterator & operator++() { ++m_Iter; return *this; } 00199 ConstIterator operator++(int) { ConstIterator temp(*this); ++m_Iter; return temp; } 00200 ConstIterator & operator--() { --m_Iter; return *this; } 00201 ConstIterator operator--(int) { ConstIterator temp(*this); --m_Iter; return temp; } 00202 00203 bool operator==(const Iterator & r) const { return m_Iter == r.m_Iter; } 00204 bool operator!=(const Iterator & r) const { return m_Iter != r.m_Iter; } 00205 bool operator==(const ConstIterator & r) const { return m_Iter == r.m_Iter; } 00206 bool operator!=(const ConstIterator & r) const { return m_Iter != r.m_Iter; } 00207 00209 ElementIdentifier Index(void) const { return m_Iter->first; } 00210 00212 const Element & Value(void) const { return m_Iter->second; } 00213 private: 00214 MapConstIterator m_Iter; 00215 friend class Iterator; 00216 }; 00217 00218 /* Declare the public interface routines. */ 00219 00227 Element & ElementAt(ElementIdentifier); 00228 00233 const Element & ElementAt(ElementIdentifier) const; 00234 00242 Element & CreateElementAt(ElementIdentifier); 00243 00248 Element GetElement(ElementIdentifier) const; 00249 00254 void SetElement(ElementIdentifier, Element); 00255 00260 void InsertElement(ElementIdentifier, Element); 00261 00266 bool IndexExists(ElementIdentifier) const; 00267 00273 bool GetElementIfIndexExists(ElementIdentifier, Element *) const; 00274 00280 void CreateIndex(ElementIdentifier); 00281 00286 void DeleteIndex(ElementIdentifier); 00287 00291 ConstIterator Begin(void) const; 00292 00296 ConstIterator End(void) const; 00297 00301 Iterator Begin(void); 00302 00306 Iterator End(void); 00307 00311 ElementIdentifier Size(void) const; 00312 00319 void Reserve(ElementIdentifier); 00320 00326 void Squeeze(void); 00327 00332 void Initialize(void); 00333 }; 00334 } // end namespace itk 00335 00336 // Define instantiation macro for this template. 00337 #define ITK_TEMPLATE_MapContainer(_, EXPORT, TypeX, TypeY) \ 00338 namespace itk \ 00339 { \ 00340 _( 2 ( class EXPORT MapContainer< ITK_TEMPLATE_2 TypeX > ) ) \ 00341 namespace Templates \ 00342 { \ 00343 typedef MapContainer< ITK_TEMPLATE_2 TypeX > \ 00344 MapContainer##TypeY; \ 00345 } \ 00346 } 00347 00348 #if ITK_TEMPLATE_EXPLICIT 00349 #include "Templates/itkMapContainer+-.h" 00350 #endif 00351 00352 #if ITK_TEMPLATE_TXX 00353 #include "itkMapContainer.hxx" 00354 #endif 00355 00356 #endif 00357