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
00026 #ifndef MLN_CANVAS_BROWSING_SNAKE_GENERIC_HH
00027 # define MLN_CANVAS_BROWSING_SNAKE_GENERIC_HH
00028
00032
00033 # include <vector>
00034 # include <mln/core/concept/browsing.hh>
00035
00036
00037 namespace mln
00038 {
00039
00040 namespace canvas
00041 {
00042
00043 namespace browsing
00044 {
00045
00047
00075 struct snake_generic_t : public Browsing< snake_generic_t >
00076 {
00077
00078 template <typename F>
00079 void operator()(F& f) const;
00080
00081 };
00082
00083 extern const snake_generic_t snake_generic;
00084
00085 # ifndef MLN_INCLUDE_ONLY
00086
00087 const snake_generic_t snake_generic;
00088
00089 template <typename F>
00090 inline
00091 void
00092 snake_generic_t::operator()(F& f) const
00093 {
00094 trace::entering("canvas::browsing::snake_generic");
00095 mln_precondition(f.input.is_valid());
00096
00097
00098 f.p = f.input.bbox().pmin();
00099
00100 std::vector< int > directions(f.moves.size(), 0);
00101 unsigned deph = 0;
00102 unsigned total_deph = f.moves.size() / 2 + 1;
00103
00104
00105 f.init();
00106
00107 bool first = true;
00108 directions[deph] = 1;
00109 deph = total_deph - 1;
00110
00111
00112 (f.*(f.moves[(deph - 1) * 2 - 1 + directions[deph - 1]])) ();
00113 while (deph > 0)
00114 {
00115 mln_assertion(deph <= total_deph);
00116 mln_assertion(deph > 0);
00117
00118 if (!f.input.domain().has(f.p +
00119 f.dps[(deph - 1) * 2 - 1 + directions[deph - 1]]))
00120 {
00121
00122 deph--;
00123 if (deph >= 1)
00124
00125 directions[deph] = directions[deph] == 1 ? 0 : 1;
00126 continue;
00127 }
00128
00129 if (!first)
00130 {
00131
00132 f.p += f.dps[(deph - 1) * 2 - 1 + directions[deph - 1]];
00133
00134 (f.*(f.moves[(deph - 1) * 2 - 1 + directions[deph - 1]])) ();
00135 }
00136 else
00137 first = false;
00138
00139 if (deph != total_deph)
00140 {
00141
00142 deph++;
00143 first = true;
00144 }
00145 }
00146
00147 trace::exiting("canvas::browsing::snake_generic");
00148 }
00149
00150 # endif // ! MLN_INCLUDE_ONLY
00151
00152 }
00153
00154 }
00155
00156 }
00157
00158
00159 #endif // ! MLN_CANVAS_BROWSING_SNAKE_GENERIC_HH