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
00027 #ifndef MLN_CANVAS_BROWSING_DIRECTIONAL_HH
00028 # define MLN_CANVAS_BROWSING_DIRECTIONAL_HH
00029
00033
00034 # include <mln/core/concept/browsing.hh>
00035 # include <mln/core/concept/image.hh>
00036
00037 namespace mln
00038 {
00039
00040 namespace canvas
00041 {
00042
00043 namespace browsing
00044 {
00045
00047
00090 struct directional_t : public Browsing< directional_t >
00091 {
00092 template <typename F>
00093 void operator()(F& f) const;
00094 };
00095
00096 extern const directional_t directional;
00097
00098 # ifndef MLN_INCLUDE_ONLY
00099
00100 # ifndef MLN_WO_GLOBAL_VARS
00101
00102 const directional_t directional;
00103
00104 # endif // ! MLN_WO_GLOBAL_VARS
00105
00106 template <typename F>
00107 inline
00108 void
00109 directional_t::operator()(F& f) const
00110 {
00111 trace::entering("canvas::browsing::directional");
00112 mln_precondition(f.dir < f.dim);
00113 typedef typename F::I I;
00114
00115 mln_psite(I)
00116 pmin = f.input.domain().pmin(),
00117 pmax = f.input.domain().pmax();
00118
00119 f.p = pmin;
00120
00121 f.init();
00122
00123 do
00124 {
00125
00126
00127 f.init_run();
00128 while (f.p[f.dir] <= pmax[f.dir])
00129 {
00130 f.next();
00131 ++f.p[f.dir];
00132 }
00133 f.p[f.dir] = pmin[f.dir];
00134
00135
00136
00137 for (int c = F::dim - 1; c >= 0; --c)
00138 {
00139 if (c == int(f.dir))
00140 continue;
00141 if (f.p[c] != pmax[c])
00142 {
00143 ++f.p[c];
00144 break;
00145 }
00146 f.p[c] = pmin[c];
00147 }
00148
00149 } while (f.p != pmin);
00150
00151 f.final();
00152 trace::exiting("canvas::browsing::directional");
00153 }
00154
00155 # endif // ! MLN_INCLUDE_ONLY
00156
00157 }
00158
00159 }
00160
00161 }
00162
00163 #endif // ! MLN_CANVAS_BROWSING_DIRECTIONAL_HH