Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkTreeIteratorBase_h
00018 #define __itkTreeIteratorBase_h
00019
00020 #include <itkTreeNode.h>
00021
00022 namespace itk {
00023
00041 template <class TTreeType>
00042 class TreeIteratorBase
00043 {
00044 public:
00045
00047 typedef TreeIteratorBase Self;
00048 typedef typename TTreeType::ValueType ValueType;
00049 typedef typename TTreeType::TreeNodeType TreeNodeType;
00050
00052 virtual bool Add(ValueType element);
00053
00055 virtual bool Add(int position, ValueType element);
00056
00058 virtual bool Add(TTreeType& subTree);
00059
00061 virtual const ValueType& Get() const;
00062
00064 virtual TTreeType* GetSubTree() const;
00065
00067 virtual bool IsLeaf() const;
00068
00070 virtual bool IsRoot() const;
00071
00073 virtual int GetType() const = 0;
00074
00076 virtual bool GoToChild(int number = 0);
00077
00079 virtual bool GoToParent( );
00080
00082 void Set(ValueType element);
00083
00085 virtual bool HasChild(int number = 0) const;
00086
00088 virtual int ChildPosition(ValueType element) const;
00089
00091 virtual bool RemoveChild(int number);
00092
00094 virtual int CountChildren() const;
00095
00097 virtual bool HasParent() const;
00098
00100 virtual bool Disconnect();
00101
00103 virtual TreeIteratorBase<TTreeType>* Children();
00104
00106 virtual TreeIteratorBase<TTreeType>* Parents();
00107
00109 virtual TreeIteratorBase<TTreeType>* GetChild(int number) const;
00110
00112 virtual int Count();
00113
00115 bool Remove();
00116
00118 virtual TreeNodeType* GetNode();
00119 virtual const TreeNodeType* GetNode() const;
00121
00123 TreeNodeType* GetRoot();
00124 const TreeNodeType* GetRoot() const;
00126
00128 TTreeType* GetTree() const;
00129
00131 const TreeNodeType* GetParent() const;
00132
00134 void GoToBegin()
00135 {
00136 m_Position = m_Begin;
00137 }
00138
00140 void GoToEnd()
00141 {
00142 m_Position = m_End;
00143 }
00144
00146 bool IsAtBegin(void) const
00147 {
00148 return (m_Position == m_Begin);
00149 }
00150
00153 bool IsAtEnd(void) const
00154 {
00155 return (m_Position == m_End);
00156 }
00157
00159 virtual TreeIteratorBase<TTreeType>* Clone() = 0;
00160
00162 enum{
00163 UNDEFIND = 0,
00164 PREORDER = 1,
00165 INORDER = 2,
00166 POSTORDER = 3,
00167 LEVELORDER = 4,
00168 CHILD = 5,
00169 ROOT = 6,
00170 LEAF = 7
00171 };
00172
00174 Self &
00175 operator++()
00176 {
00177 this->Next();
00178 return *this;
00179 }
00180
00182 void
00183 operator++(int)
00184 {
00185
00186 this->Next();
00187 }
00188
00190 const Self & operator=(const Self& iterator)
00191 {
00192 m_Position = iterator.m_Position;
00193 m_Begin = iterator.m_Begin;
00194 m_End = iterator.m_End;
00195 m_Root = iterator.m_Root;
00196 m_Tree = iterator.m_Tree;
00197 return *this;
00198 }
00199
00200 virtual ~TreeIteratorBase() {}
00201
00202 protected:
00203
00205 TreeIteratorBase( TTreeType* tree, const TreeNodeType* start);
00206 TreeIteratorBase( const TTreeType* tree, const TreeNodeType* start);
00208
00209 mutable TreeNodeType* m_Position;
00210 mutable TreeNodeType* m_Begin;
00211 mutable TreeNodeType* m_End;
00212 const TreeNodeType* m_Root;
00213 TTreeType* m_Tree;
00214
00215 virtual bool HasNext() const = 0;
00216 virtual const ValueType& Next() = 0;
00217 };
00218
00219 }
00220
00221
00222 #define ITK_TEMPLATE_TreeIteratorBase(_, EXPORT, x, y) namespace itk { \
00223 _(1(class EXPORT TreeIteratorBase< ITK_TEMPLATE_1 x >)) \
00224 namespace Templates { typedef TreeIteratorBase< ITK_TEMPLATE_1 x > \
00225 TreeIteratorBase##y; } \
00226 }
00227
00228 #if ITK_TEMPLATE_EXPLICIT
00229 # include "Templates/itkTreeIteratorBase+-.h"
00230 #endif
00231
00232 #if ITK_TEMPLATE_TXX
00233 # include "itkTreeIteratorBase.txx"
00234 #endif
00235
00236 #endif
00237