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 __itkSparseFieldLayer_h 00019 #define __itkSparseFieldLayer_h 00020 00021 #include "itkObjectFactory.h" 00022 #include "itkObject.h" 00023 #include <vector> 00024 00025 namespace itk 00026 { 00035 template< class TNodeType > 00036 class ConstSparseFieldLayerIterator 00037 { 00038 public: 00039 const TNodeType & operator*() const 00040 { return *m_Pointer; } 00041 00042 const TNodeType * operator->() const 00043 { return m_Pointer; } 00044 00045 const TNodeType * GetPointer() const 00046 { return m_Pointer; } 00047 00048 bool operator==(const ConstSparseFieldLayerIterator o) const 00049 { 00050 if ( m_Pointer == o.m_Pointer ) { return true; } 00051 else { return false; } 00052 } 00053 00054 bool operator!=(const ConstSparseFieldLayerIterator o) const 00055 { 00056 if ( m_Pointer != o.m_Pointer ) { return true; } 00057 else { return false; } 00058 } 00059 00060 ConstSparseFieldLayerIterator & operator++() 00061 { 00062 m_Pointer = m_Pointer->Next; 00063 return *this; 00064 } 00065 00066 ConstSparseFieldLayerIterator & operator--() 00067 { 00068 m_Pointer = m_Pointer->Previous; 00069 return *this; 00070 } 00071 00072 ConstSparseFieldLayerIterator() 00073 { m_Pointer = 0; } 00074 00075 ConstSparseFieldLayerIterator(TNodeType *p) 00076 { m_Pointer = p; } 00077 00078 ~ConstSparseFieldLayerIterator() {} 00079 protected: 00080 TNodeType *m_Pointer; 00081 }; 00082 00087 template< class TNodeType > 00088 class SparseFieldLayerIterator: 00089 public ConstSparseFieldLayerIterator< TNodeType > 00090 { 00091 public: 00092 typedef ConstSparseFieldLayerIterator< TNodeType > Superclass; 00093 00094 SparseFieldLayerIterator():Superclass() 00095 {} 00096 00097 SparseFieldLayerIterator(TNodeType *p):Superclass(p) 00098 {} 00099 00100 TNodeType & operator*() 00101 { return *this->m_Pointer; } 00102 00103 TNodeType * operator->() 00104 { return this->m_Pointer; } 00105 00106 TNodeType * GetPointer() 00107 { return this->m_Pointer; } 00108 00109 SparseFieldLayerIterator & operator++() 00110 { 00111 this->m_Pointer = this->m_Pointer->Next; 00112 return *this; 00113 } 00114 00115 SparseFieldLayerIterator & operator--() 00116 { 00117 this->m_Pointer = this->m_Pointer->Previous; 00118 return *this; 00119 } 00120 00121 SparseFieldLayerIterator & operator=(Superclass & sc) 00122 { 00123 this->m_Pointer = const_cast< TNodeType * >( sc.GetPointer() ); 00124 return *this; 00125 } 00126 }; 00127 00150 template< class TNodeType > 00151 class ITK_EXPORT SparseFieldLayer: 00152 public Object 00153 { 00154 public: 00156 typedef SparseFieldLayer Self; 00157 typedef Object Superclass; 00158 typedef SmartPointer< Self > Pointer; 00159 typedef SmartPointer< const Self > ConstPointer; 00160 00162 itkNewMacro(Self); 00163 00165 itkTypeMacro(SparseFieldLayer, Object); 00166 00168 typedef TNodeType NodeType; 00169 00172 typedef NodeType ValueType; 00173 00175 typedef SparseFieldLayerIterator< NodeType > Iterator; 00176 00178 typedef ConstSparseFieldLayerIterator< NodeType > ConstIterator; 00179 00181 struct RegionType { 00182 ConstIterator first; 00183 ConstIterator last; // this is one past the actual last element 00184 }; 00185 00186 typedef std::vector< RegionType > RegionListType; 00187 00190 NodeType * Front() 00191 { return m_HeadNode->Next; } 00192 00194 const NodeType * Front() const 00195 { return m_HeadNode->Next; } 00196 00198 void PopFront() 00199 { 00200 m_HeadNode->Next = m_HeadNode->Next->Next; 00201 m_HeadNode->Next->Previous = m_HeadNode; 00202 m_Size -= 1; 00203 } 00204 00206 void PushFront(NodeType *n) 00207 { 00208 n->Next = m_HeadNode->Next; 00209 n->Previous = m_HeadNode; 00210 m_HeadNode->Next->Previous = n; 00211 m_HeadNode->Next = n; 00212 m_Size += 1; 00213 } 00214 00216 void Unlink(NodeType *n) 00217 { 00218 n->Previous->Next = n->Next; 00219 n->Next->Previous = n->Previous; 00220 m_Size -= 1; 00221 } 00222 00224 Iterator Begin() 00225 { return Iterator(m_HeadNode->Next); } 00226 00229 ConstIterator Begin() const 00230 { return ConstIterator(m_HeadNode->Next); } 00231 00233 Iterator End() 00234 { return Iterator(m_HeadNode); } 00235 00237 ConstIterator End() const 00238 { return ConstIterator(m_HeadNode); } 00239 00242 bool Empty() const 00243 { 00244 if ( m_HeadNode->Next == m_HeadNode ) { return true; } 00245 else { return false; } 00246 } 00248 00251 unsigned int Size() const; 00252 00255 RegionListType SplitRegions(int num) const; 00256 00257 protected: 00258 SparseFieldLayer(); 00259 ~SparseFieldLayer(); 00260 virtual void PrintSelf(std::ostream & os, Indent indent) const; 00261 00262 private: 00263 SparseFieldLayer(const Self &); //purposely not implemented 00264 void operator=(const Self &); //purposely not implemented 00265 00268 NodeType * m_HeadNode; 00269 unsigned int m_Size; 00270 }; 00271 } // end namespace itk 00272 00273 #ifndef ITK_MANUAL_INSTANTIATION 00274 #include "itkSparseFieldLayer.hxx" 00275 #endif 00276 00277 #endif 00278