00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00028 #ifndef _VGTL_ADDALGO_H_
00029 #define _VGTL_ADDALGO_H_
00030
00031 #include <algorithm>
00032 #include <vgtl_helpers.h>
00033 #include <vgtl_gdata.h>
00034
00035 __VGTL_BEGIN_NAMESPACE
00036
00037 #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
00038 #pragma set woff 1209
00039 #endif
00040
00058 template <class _Walker, class _Visitor>
00059 typename _Visitor::return_value recursive_safe_walk_if(_Walker __w, _Visitor __f)
00060 {
00061 typename _Walker::children_const_iterator __it;
00062 unsigned int i;
00063
00064 if(__w.is_ground())
00065 {
00066 __f.vinit();
00067 for(i = 0; i < __w.n_children(); ++i)
00068 {
00069 __it = __w.node()->_C_children.begin()+i;
00070 __f.vcollect(_recursive_safe_walk_if(__w>>__it, __f));
00071 }
00072 return __f.vvalue();
00073 }
00074 else if(__w.is_sky())
00075 return __f.vvalue();
00076 else
00077 {
00078 while(1)
00079 {
00080 if(__f.preorder(*__w))
00081 {
00082 for(i = 0; i < __w.n_children(); ++i)
00083 {
00084 __it = __w.node()->_C_children.begin()+i;
00085 __f.collect(*__w, _recursive_safe_walk_if(__w>>__it, __f));
00086 }
00087 }
00088 if(!__f.postorder(*__w))
00089 break;
00090 }
00091 return __f.value();
00092 }
00093 }
00094
00113 template <class _Walker, class _Visitor>
00114 typename _Visitor::return_value _recursive_safe_walk_if(_Walker __w, _Visitor __f)
00115 {
00116 typename _Walker::children_const_iterator __it;
00117 unsigned int i;
00118
00119 if(__w.is_sky())
00120 return __f.vvalue();
00121 while(1)
00122 {
00123 if(__f.preorder(*__w))
00124 {
00125 for(i = 0; i < __w.n_children(); ++i)
00126 {
00127 __it = __w.node()->_C_children.begin()+i;
00128 __f.collect(*__w, _recursive_safe_walk_if(__w>>__it, __f));
00129 }
00130 }
00131 if(!__f.postorder(*__w))
00132 break;
00133 }
00134 return __f.value();
00135 }
00136
00137 #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
00138 #pragma reset woff 1209
00139 #endif
00140
00141 __VGTL_END_NAMESPACE
00142
00143 #endif