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_TOPO_N_FACE_ITER_HH
00027 # define MLN_TOPO_N_FACE_ITER_HH
00028
00033
00034 # include <mln/topo/internal/complex_set_iterator_base.hh>
00035 # include <mln/topo/face.hh>
00036
00037
00038
00039
00040
00041
00042
00043 namespace mln
00044 {
00045
00046 namespace topo
00047 {
00048
00049
00050 template <unsigned D> class complex;
00051
00052 namespace internal
00053 {
00054
00055
00056 template <typename F, typename E>
00057 class complex_set_iterator_base;
00058
00059 }
00060
00061
00062
00063
00064
00065
00070
00071 template <unsigned D>
00072 class n_face_fwd_iter
00073 : public internal::complex_set_iterator_base< topo::face<D>,
00074 n_face_fwd_iter<D> >
00075 {
00076
00077 private:
00078 typedef n_face_fwd_iter<D> self_;
00079 typedef internal::complex_set_iterator_base< topo::face<D>, self_ > super_;
00080
00081 public:
00082 using super_::is_valid;
00083 using super_::invalidate;
00084
00085 public:
00088 n_face_fwd_iter();
00089
00090
00091 n_face_fwd_iter(complex<D>& c, unsigned n);
00093
00097 void start();
00099 void next_();
00101
00106 unsigned n() const;
00107 void set_n (unsigned n);
00109
00110 private:
00112 void invalidate_face_id_();
00113
00114 private:
00115 using super_::f_;
00116 };
00117
00118
00119
00120
00121
00122
00126 template <unsigned D>
00127 class n_face_bkd_iter
00128 : public internal::complex_set_iterator_base< topo::face<D>,
00129 n_face_bkd_iter<D> >
00130 {
00131
00132 private:
00133 typedef n_face_bkd_iter<D> self_;
00134 typedef internal::complex_set_iterator_base< topo::face<D>, self_ > super_;
00135
00136 public:
00137 using super_::is_valid;
00138 using super_::invalidate;
00139
00140 public:
00143 n_face_bkd_iter();
00144
00145
00146 n_face_bkd_iter(complex<D>& c, unsigned n);
00148
00152 void start();
00154 void next_();
00156
00161 unsigned n() const;
00162 void set_n (unsigned n);
00164
00165 private:
00167 void invalidate_face_id_();
00168
00169 private:
00170 using super_::f_;
00171 };
00172
00173
00174
00175 # ifndef MLN_INCLUDE_ONLY
00176
00177
00178
00179
00180
00181 template <unsigned D>
00182 inline
00183 n_face_fwd_iter<D>::n_face_fwd_iter()
00184 : super_()
00185 {
00186 }
00187
00188 template <unsigned D>
00189 inline
00190 n_face_fwd_iter<D>::n_face_fwd_iter(complex<D>& c, unsigned n)
00191 : super_(c)
00192 {
00193 mln_precondition(n <= D);
00194 set_cplx(c);
00195 set_n(n);
00196 mln_postcondition(!is_valid());
00197 }
00198
00199 template <unsigned D>
00200 inline
00201 void
00202 n_face_fwd_iter<D>::start()
00203 {
00204 f_.set_face_id(0u);
00205 }
00206
00207 template <unsigned D>
00208 inline
00209 void
00210 n_face_fwd_iter<D>::next_()
00211 {
00212 if (is_valid())
00213 {
00214 if (f_.face_id() + 1 < f_.cplx().nfaces_of_dim(n()))
00215 f_.inc_face_id();
00216 else
00217
00218
00219
00220 invalidate_face_id_();
00221 }
00222 }
00223
00224 template <unsigned D>
00225 inline
00226 void
00227 n_face_fwd_iter<D>::invalidate_face_id_()
00228 {
00229 f_.set_face_id(f_.cplx().nfaces_of_dim(n()));
00230 }
00231
00232 template <unsigned D>
00233 inline
00234 unsigned
00235 n_face_fwd_iter<D>::n() const
00236 {
00237 return f_.n();
00238 }
00239
00240 template <unsigned D>
00241 inline
00242 void
00243 n_face_fwd_iter<D>::set_n(unsigned n)
00244 {
00245 mln_precondition(n <= D);
00246 f_.set_n(n);
00247 }
00248
00249
00250
00251
00252
00253
00254 template <unsigned D>
00255 inline
00256 n_face_bkd_iter<D>::n_face_bkd_iter()
00257 : super_()
00258 {
00259 }
00260
00261 template <unsigned D>
00262 inline
00263 n_face_bkd_iter<D>::n_face_bkd_iter(complex<D>& c, unsigned n)
00264 : super_(c)
00265 {
00266 mln_precondition(n <= D);
00267 set_cplx(c);
00268 set_n(n);
00269 mln_postcondition(!is_valid());
00270 }
00271
00272 template <unsigned D>
00273 inline
00274 void
00275 n_face_bkd_iter<D>::start()
00276 {
00277 f_.set_face_id(f_.cplx().nfaces_of_dim(n()) - 1);
00278 }
00279
00280 template <unsigned D>
00281 inline
00282 void
00283 n_face_bkd_iter<D>::next_()
00284 {
00285 if (is_valid())
00286 {
00287 if (f_.face_id() > 0)
00288 f_.dec_face_id();
00289 else
00290
00291
00292
00293 invalidate_face_id_();
00294 }
00295 }
00296
00297 template <unsigned D>
00298 inline
00299 void
00300 n_face_bkd_iter<D>::invalidate_face_id_()
00301 {
00302 f_.set_face_id(f_.cplx().nfaces_of_dim(n()));
00303 }
00304
00305 template <unsigned D>
00306 inline
00307 unsigned
00308 n_face_bkd_iter<D>::n() const
00309 {
00310 return f_.n();
00311 }
00312
00313 template <unsigned D>
00314 inline
00315 void
00316 n_face_bkd_iter<D>::set_n(unsigned n)
00317 {
00318 mln_precondition(n <= D);
00319 f_.set_n(n);
00320 }
00321
00322 # endif // ! MLN_INCLUDE_ONLY
00323
00324 }
00325
00326 }
00327
00328 #endif // ! MLN_TOPO_N_FACE_ITER_HH