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_CORE_SITE_SET_BOX_PITER_HH
00027 # define MLN_CORE_SITE_SET_BOX_PITER_HH
00028
00032
00033 # include <mln/core/internal/site_set_iterator_base.hh>
00034 # include <mln/core/concept/box.hh>
00035 # include <mln/core/site_set/box.hh>
00036
00037
00038 namespace mln
00039 {
00040
00047 template <typename P>
00048 class box_fwd_piter_ : public internal::site_set_iterator_base< box<P>,
00049 box_fwd_piter_<P> >
00050 {
00051 typedef box_fwd_piter_<P> self_;
00052 typedef internal::site_set_iterator_base< box<P>, self_ > super_;
00053
00054 public:
00055
00056
00057 enum { dim = P::dim };
00058
00060 box_fwd_piter_();
00061
00066 box_fwd_piter_(const mln::box<P>& b);
00067
00069 bool is_valid_() const;
00070
00072 void invalidate_();
00073
00075 void start_();
00076
00078 void next_();
00079
00080 protected:
00081 using super_::p_;
00082 using super_::s_;
00083 };
00084
00085
00086
00093 template <typename P>
00094 class box_bkd_piter_ : public internal::site_set_iterator_base< box<P>,
00095 box_bkd_piter_<P> >
00096 {
00097 typedef box_bkd_piter_<P> self_;
00098 typedef internal::site_set_iterator_base< box<P>, self_ > super_;
00099
00100 public:
00101
00102
00103 enum { dim = P::dim };
00104
00106 box_bkd_piter_();
00107
00112 box_bkd_piter_(const box<P>& b);
00113
00115 bool is_valid_() const;
00116
00118 void invalidate_();
00119
00121 void start_();
00122
00124 void next_();
00125
00126 protected:
00127 using super_::p_;
00128 using super_::s_;
00129 };
00130
00131
00132
00133
00134 # ifndef MLN_INCLUDE_ONLY
00135
00136
00137
00138
00139 template <typename P>
00140 inline
00141 box_fwd_piter_<P>::box_fwd_piter_()
00142 {
00143 }
00144
00145 template <typename P>
00146 inline
00147 box_fwd_piter_<P>::box_fwd_piter_(const mln::box<P>& b)
00148 {
00149 this->change_target(b);
00150 }
00151
00152 template <typename P>
00153 inline
00154 bool
00155 box_fwd_piter_<P>::is_valid_() const
00156 {
00157 return p_[0] != s_->pmax()[0] + 1;
00158 }
00159
00160 template <typename P>
00161 inline
00162 void
00163 box_fwd_piter_<P>::invalidate_()
00164 {
00165 p_[0] = static_cast<def::coord>(s_->pmax()[0] + 1);
00166 }
00167
00168 template <typename P>
00169 inline
00170 void
00171 box_fwd_piter_<P>::start_()
00172 {
00173 p_ = s_->pmin();
00174 }
00175
00176 template <typename P>
00177 inline
00178 void
00179 box_fwd_piter_<P>::next_()
00180 {
00181 for (int i = dim - 1; i >= 0; --i)
00182 if (p_[i] != s_->pmax()[i])
00183 {
00184 ++p_[i];
00185 break;
00186 }
00187 else
00188 {
00189 p_[i] = s_->pmin()[i];
00190 if (i == 0)
00191 invalidate_();
00192 }
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206 }
00207
00208
00209
00210
00211 template <typename P>
00212 inline
00213 box_bkd_piter_<P>::box_bkd_piter_()
00214 {
00215 }
00216
00217 template <typename P>
00218 inline
00219 box_bkd_piter_<P>::box_bkd_piter_(const box<P>& b)
00220 {
00221 this->change_target(b);
00222 }
00223
00224 template <typename P>
00225 inline
00226 bool
00227 box_bkd_piter_<P>::is_valid_() const
00228 {
00229 return p_[0] != s_->pmin()[0] - 1;
00230 }
00231
00232 template <typename P>
00233 inline
00234 void
00235 box_bkd_piter_<P>::invalidate_()
00236 {
00237 p_[0] = mln_coord(P)(s_->pmin()[0] - 1);
00238 }
00239
00240 template <typename P>
00241 inline
00242 void
00243 box_bkd_piter_<P>::start_()
00244 {
00245 p_ = s_->pmax();
00246 }
00247
00248 template <typename P>
00249 inline
00250 void
00251 box_bkd_piter_<P>::next_()
00252 {
00253 for (int i = dim - 1; i >= 0; --i)
00254 if (p_[i] == s_->pmin()[i])
00255 p_[i] = s_->pmax()[i];
00256 else
00257 {
00258 --p_[i];
00259 break;
00260 }
00261 if (p_ == s_->pmax())
00262 invalidate_();
00263 }
00264
00265 # endif // ! MLN_INCLUDE_ONLY
00266
00267 }
00268
00269
00270 #endif // ! MLN_CORE_SITE_SET_BOX_PITER_HH