00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef _itkSmartPointerVectorContainer_txx
00018 #define _itkSmartPointerVectorContainer_txx
00019 #include "itkSmartPointerVectorContainer.h"
00020
00021 #include "itkNumericTraits.h"
00022
00023 namespace itk
00024 {
00025
00034 template <typename TElementIdentifier, typename TElement>
00035 typename SmartPointerVectorContainer< TElementIdentifier , TElement >::ElementPointer&
00036 SmartPointerVectorContainer< TElementIdentifier , TElement >
00037 ::ElementAt(ElementIdentifier id)
00038 {
00039 this->Modified();
00040 return this->VectorType::operator[](id);
00041 }
00042
00049 template <typename TElementIdentifier, typename TElement>
00050 const typename SmartPointerVectorContainer< TElementIdentifier , TElement >::ConstElementPointer
00051 SmartPointerVectorContainer< TElementIdentifier , TElement >
00052 ::ElementAt(ElementIdentifier id) const
00053 {
00054 return ConstElementPointer(this->VectorType::operator[](id));
00055 }
00056
00057
00066 template <typename TElementIdentifier, typename TElement>
00067 typename SmartPointerVectorContainer< TElementIdentifier , TElement >::ElementPointer&
00068 SmartPointerVectorContainer< TElementIdentifier , TElement >
00069 ::CreateElementAt(ElementIdentifier id)
00070 {
00071 if(id >= this->VectorType::size())
00072 {
00073 this->CreateIndex(id);
00074 }
00075 this->Modified();
00076 return this->VectorType::operator[](id);
00077 }
00078
00079
00084 template <typename TElementIdentifier, typename TElement>
00085 const typename SmartPointerVectorContainer< TElementIdentifier , TElement >::ConstElementPointer
00086 SmartPointerVectorContainer< TElementIdentifier , TElement >
00087 ::GetElement(ElementIdentifier id) const
00088 {
00089 return ConstElementPointer(this->VectorType::operator[](id).GetPointer());
00090 }
00091
00092
00097 template <typename TElementIdentifier, typename TElement>
00098 void
00099 SmartPointerVectorContainer< TElementIdentifier , TElement >
00100 ::SetElement(ElementIdentifier id, Element* element)
00101 {
00102 this->VectorType::operator[](id) = element;
00103 this->Modified();
00104 }
00105
00106
00112 template <typename TElementIdentifier, typename TElement>
00113 void
00114 SmartPointerVectorContainer< TElementIdentifier , TElement >
00115 ::InsertElement(ElementIdentifier id, Element* element)
00116 {
00117 if(id >= static_cast<ElementIdentifier>(this->VectorType::size()))
00118 {
00119 this->CreateIndex(id);
00120 }
00121 this->VectorType::operator[](id) = element;
00122 this->Modified();
00123 }
00124
00125
00130 template <typename TElementIdentifier, typename TElement>
00131 bool
00132 SmartPointerVectorContainer< TElementIdentifier , TElement >
00133 ::IndexExists(ElementIdentifier id) const
00134 {
00135 return (NumericTraits<ElementIdentifier>::IsNonnegative(id)
00136 && (id < this->VectorType::size()));
00137 }
00138
00139
00140
00146 template <typename TElementIdentifier, typename TElement>
00147 bool
00148 SmartPointerVectorContainer< TElementIdentifier , TElement >
00149 ::GetElementIfIndexExists(ElementIdentifier id, Element** element) const
00150 {
00151 if (NumericTraits<ElementIdentifier>::IsNonnegative(id)
00152 && (id < this->VectorType::size()))
00153 {
00154 if(element)
00155 {
00156 *element = this->VectorType::operator[](id).GetPointer();
00157 }
00158 return true;
00159 }
00160 return false;
00161 }
00162
00163
00169 template <typename TElementIdentifier, typename TElement>
00170 void
00171 SmartPointerVectorContainer< TElementIdentifier , TElement >
00172 ::CreateIndex(ElementIdentifier id)
00173 {
00174 if(id >= static_cast<ElementIdentifier>(this->VectorType::size()))
00175 {
00180 this->VectorType::resize(id+1);
00181 this->Modified();
00182 }
00183 else if(id > 0)
00184 {
00189 this->VectorType::operator[](id) = NULL;
00190 this->Modified();
00191 }
00192 }
00193
00194
00199 template <typename TElementIdentifier, typename TElement>
00200 void
00201 SmartPointerVectorContainer< TElementIdentifier , TElement >
00202 ::DeleteIndex(ElementIdentifier id)
00203 {
00204 this->VectorType::operator[](id) = NULL;
00205 this->Modified();
00206 }
00207
00208
00212 template <typename TElementIdentifier, typename TElement>
00213 typename SmartPointerVectorContainer< TElementIdentifier , TElement >::ConstIterator
00214 SmartPointerVectorContainer< TElementIdentifier , TElement >
00215 ::Begin(void) const
00216 {
00217 return ConstIterator(0, this, this->VectorType::begin());
00218 }
00219
00220
00224 template <typename TElementIdentifier, typename TElement>
00225 typename SmartPointerVectorContainer< TElementIdentifier , TElement >::ConstIterator
00226 SmartPointerVectorContainer< TElementIdentifier , TElement >
00227 ::End(void) const
00228 {
00229 return ConstIterator(this->VectorType::size()-1, this, this->VectorType::end());
00230 }
00231
00232
00236 template <typename TElementIdentifier, typename TElement>
00237 typename SmartPointerVectorContainer< TElementIdentifier , TElement >::Iterator
00238 SmartPointerVectorContainer< TElementIdentifier , TElement >
00239 ::Begin(void)
00240 {
00241 return Iterator(0, this, this->VectorType::begin());
00242 }
00243
00244
00248 template <typename TElementIdentifier, typename TElement>
00249 typename SmartPointerVectorContainer< TElementIdentifier , TElement >::Iterator
00250 SmartPointerVectorContainer< TElementIdentifier , TElement >
00251 ::End(void)
00252 {
00253 return Iterator(this->VectorType::size()-1, this, this->VectorType::end());
00254 }
00255
00256
00260 template <typename TElementIdentifier, typename TElement>
00261 unsigned long
00262 SmartPointerVectorContainer< TElementIdentifier , TElement >
00263 ::Size(void) const
00264 {
00265 return static_cast<unsigned long>( this->VectorType::size() );
00266 }
00267
00268
00272 template <typename TElementIdentifier, typename TElement>
00273 void
00274 SmartPointerVectorContainer< TElementIdentifier , TElement >
00275 ::Initialize(void)
00276 {
00277 this->VectorType::clear();
00278 }
00279
00280
00281
00288 template <typename TElementIdentifier, typename TElement>
00289 void
00290 SmartPointerVectorContainer< TElementIdentifier , TElement >
00291 ::Reserve(ElementIdentifier size)
00292 {
00293 this->CreateIndex(size-1);
00294 }
00295
00296
00302 template <typename TElementIdentifier, typename TElement>
00303 void
00304 SmartPointerVectorContainer< TElementIdentifier , TElement >
00305 ::Squeeze(void)
00306 {
00307 }
00308
00309 }
00310
00311 #endif