00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkVectorContainer_h
00018 #define __itkVectorContainer_h
00019
00020 #include "itkObject.h"
00021 #include "itkObjectFactory.h"
00022
00023 #include <utility>
00024 #include <vector>
00025
00026 namespace itk
00027 {
00028
00044 template <
00045 typename TElementIdentifier,
00046 typename TElement
00047 >
00048 class ITK_EXPORT VectorContainer:
00049 public Object,
00050 public std::vector<TElement>
00051 {
00052 public:
00054 typedef VectorContainer Self;
00055 typedef Object Superclass;
00056 typedef SmartPointer<Self> Pointer;
00057 typedef SmartPointer<const Self> ConstPointer;
00058
00060 typedef TElementIdentifier ElementIdentifier;
00061 typedef TElement Element;
00062
00063 private:
00065 typedef std::vector<Element> VectorType;
00066 typedef typename VectorType::size_type size_type;
00067 typedef typename VectorType::iterator VectorIterator;
00068 typedef typename VectorType::const_iterator VectorConstIterator;
00069
00070 protected:
00074 VectorContainer():
00075 Object(), VectorType() {}
00076 VectorContainer(size_type n):
00077 Object(), VectorType(n) {}
00078 VectorContainer(size_type n, const Element& x):
00079 Object(), VectorType(n, x) {}
00080 VectorContainer(const Self& r):
00081 Object(), VectorType(r) {}
00082 template <typename InputIterator>
00083 VectorContainer(InputIterator first, InputIterator last):
00084 Object(), VectorType(first, last) {}
00085
00086 public:
00087
00089 typedef VectorType STLContainerType;
00090
00092 itkNewMacro(Self);
00093
00095 itkTypeMacro(VectorContainer, Object);
00096
00098 class Iterator;
00099 class ConstIterator;
00100
00102 STLContainerType & CastToSTLContainer() {
00103 return dynamic_cast<STLContainerType &>(*this); }
00104
00106 const STLContainerType & CastToSTLConstContainer() const {
00107 return dynamic_cast<const STLContainerType &>(*this); }
00108
00110 friend class Iterator;
00111 friend class ConstIterator;
00112
00115 class Iterator
00116 {
00117 public:
00118 Iterator() {}
00119 Iterator(size_type d, const VectorIterator& i): m_Pos(d), m_Iter(i) {}
00120
00121 Iterator& operator* () { return *this; }
00122 Iterator* operator-> () { return this; }
00123 Iterator& operator++ () { ++m_Pos; ++m_Iter; return *this; }
00124 Iterator operator++ (int) { Iterator temp(*this); ++m_Pos; ++m_Iter; return temp; }
00125 Iterator& operator-- () { --m_Pos; --m_Iter; return *this; }
00126 Iterator operator-- (int) { Iterator temp(*this); --m_Pos; --m_Iter; return temp; }
00127
00128 bool operator == (const Iterator& r) const { return m_Iter == r.m_Iter; }
00129 bool operator != (const Iterator& r) const { return m_Iter != r.m_Iter; }
00130 bool operator == (const ConstIterator& r) const { return m_Iter == r.m_Iter; }
00131 bool operator != (const ConstIterator& r) const { return m_Iter != r.m_Iter; }
00132
00134 ElementIdentifier Index(void) const { return static_cast<ElementIdentifier>( m_Pos ); }
00135
00137 Element& Value(void) const { return *m_Iter; }
00138
00139 private:
00140 size_type m_Pos;
00141 VectorIterator m_Iter;
00142 friend class ConstIterator;
00143 };
00144
00147 class ConstIterator
00148 {
00149 public:
00150 ConstIterator() {}
00151 ConstIterator(size_type d, const VectorConstIterator& i): m_Pos(d), m_Iter(i) {}
00152 ConstIterator(const Iterator& r) { m_Pos = r.m_Pos; m_Iter = r.m_Iter; }
00153
00154 ConstIterator& operator* () { return *this; }
00155 ConstIterator* operator-> () { return this; }
00156 ConstIterator& operator++ () { ++m_Pos; ++m_Iter; return *this; }
00157 ConstIterator operator++ (int) { ConstIterator temp(*this); ++m_Pos; ++m_Iter; return temp; }
00158 ConstIterator& operator-- () { --m_Pos; --m_Iter; return *this; }
00159 ConstIterator operator-- (int) { ConstIterator temp(*this); --m_Pos; --m_Iter; return temp; }
00160
00161 ConstIterator& operator = (const Iterator& r) { m_Pos = r.m_Pos; m_Iter = r.m_Iter; return *this; }
00162
00163 bool operator == (const Iterator& r) const { return m_Iter == r.m_Iter; }
00164 bool operator != (const Iterator& r) const { return m_Iter != r.m_Iter; }
00165 bool operator == (const ConstIterator& r) const { return m_Iter == r.m_Iter; }
00166 bool operator != (const ConstIterator& r) const { return m_Iter != r.m_Iter; }
00167
00169 ElementIdentifier Index(void) const { return static_cast<ElementIdentifier>( m_Pos ); }
00170
00172 const Element& Value(void) const { return *m_Iter; }
00173
00174 private:
00175 size_type m_Pos;
00176 VectorConstIterator m_Iter;
00177 friend class Iterator;
00178 };
00179
00181 Element& ElementAt(ElementIdentifier);
00182 const Element& ElementAt(ElementIdentifier) const;
00183 Element& CreateElementAt(ElementIdentifier);
00184 Element GetElement(ElementIdentifier) const;
00185 void SetElement(ElementIdentifier, Element);
00186 void InsertElement(ElementIdentifier, Element);
00187 bool IndexExists(ElementIdentifier) const;
00188 bool GetElementIfIndexExists(ElementIdentifier, Element*) const;
00189 void CreateIndex(ElementIdentifier);
00190 void DeleteIndex(ElementIdentifier);
00191 ConstIterator Begin(void) const;
00192 ConstIterator End(void) const;
00193 Iterator Begin(void);
00194 Iterator End(void);
00195 unsigned long Size(void) const;
00196 void Reserve(ElementIdentifier);
00197 void Squeeze(void);
00198 void Initialize(void);
00199
00200 };
00201
00202 }
00203
00204 #ifndef ITK_MANUAL_INSTANTIATION
00205 #include "itkVectorContainer.txx"
00206 #endif
00207
00208 #endif