00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef NODETRAVERSAL_H
00019 #define NODETRAVERSAL_H
00020
00021 #include <vector>
00022 #include "node.h"
00023
00024 namespace treecomp
00025 {
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 template<class _Node, class _Container=std::vector<_Node*> >
00052 class NodeTraversal : public NonCopyable
00053 {
00054 public:
00055 virtual ~NodeTraversal(){}
00056
00057 _Container& operator()(_Node*);
00058
00059
00060 protected:
00061 virtual void walk(_Node*)=0;
00062
00063 _Container m_traversal;
00064 };
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077 template<class _Node, class _TIterator, class _Container=std::vector<_Node*> >
00078 class IterNodeTraversal : public NodeTraversal<_Node,_Container>
00079 {
00080 protected:
00081 virtual void walk(_Node*);
00082 };
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095 template<class _Node, class _Container=std::vector<_Node*> >
00096 class PreOrderNodeTraversal : public NodeTraversal<_Node,_Container>
00097 {
00098 protected:
00099 virtual void walk(_Node*);
00100 };
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111 template<class _Node, class _Container=std::vector<_Node*> >
00112 class PostOrderNodeTraversal : public NodeTraversal<_Node,_Container>
00113 {
00114 protected:
00115 virtual void walk(_Node*);
00116 };
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132 template<class _Node, class _Container>
00133 _Container& NodeTraversal<_Node,_Container>::operator()(_Node* startnode)
00134 {
00135 m_traversal.clear();
00136 walk(startnode);
00137 return m_traversal;
00138 }
00139
00140
00141
00142
00143
00144 template<class _Node, class _TIterator, class _Container>
00145 void IterNodeTraversal<_Node,_TIterator,_Container>::walk(_Node* node)
00146 {
00147 assert(node!=0);
00148 _TIterator niter;
00149 niter.setStart(node);
00150
00151 while(!niter.isEnd())
00152 {
00153 m_traversal.push_back(niter());
00154 ++niter;
00155 }
00156 }
00157
00158
00159
00160
00161
00162 template<class _Node, class _Container>
00163 void PostOrderNodeTraversal<_Node,_Container>::walk(_Node* node)
00164 {
00165 assert(node!=0);
00166 typename std::list<typename NodeTraits<_Node>::_NonConstNode*>::const_iterator nlIter;
00167 for (nlIter = node->getChildren()->begin(); nlIter != node->getChildren()->end(); ++nlIter)
00168 walk(*nlIter);
00169 m_traversal.push_back(node);
00170 }
00171
00172
00173
00174
00175
00176
00177 template<class _Node, class _Container>
00178 void PreOrderNodeTraversal<_Node,_Container>::walk(_Node* node)
00179 {
00180 assert(node!=0);
00181 m_traversal.push_back(node);
00182 typename std::list<typename NodeTraits<_Node>::_NonConstNode*>::const_iterator nlIter;
00183 for (nlIter = node->getChildren()->begin(); nlIter != node->getChildren()->end(); ++nlIter)
00184 walk(*nlIter);
00185 }
00186
00187
00188 }
00189
00190 #endif