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_INTERNAL_COMPLEX_RELATIVE_ITERATOR_BASE_HH
00027 # define MLN_TOPO_INTERNAL_COMPLEX_RELATIVE_ITERATOR_BASE_HH
00028
00049 # include <vector>
00050
00051 # include <mln/topo/internal/complex_iterator_base.hh>
00052
00053
00054
00055
00056
00057
00058
00059
00060 namespace mln
00061 {
00062
00063 namespace topo
00064 {
00065
00066 namespace internal
00067 {
00068
00069
00070 template <typename F, typename E>
00071 class complex_iterator_base;
00072
00073
00074
00075
00076
00077
00083 template <typename C, typename F, typename E>
00084 class complex_relative_iterator_base :
00085 public complex_iterator_base<F, E>
00086 {
00087 typedef complex_relative_iterator_base<C, F, E> self_;
00088
00089 public:
00091 typedef C center_type;
00093 typedef F face_type;
00094
00097 complex_relative_iterator_base();
00098 template <typename Fref>
00099 complex_relative_iterator_base(const Fref& f_ref);
00101
00105 void center_at(const center_type& c);
00106
00108 void start();
00110 void next_();
00112
00113 protected:
00116 const center_type* c_;
00117
00118
00119 typedef std::vector<face_type> adj_faces_t;
00121 adj_faces_t adj_faces_;
00122 };
00123
00124
00125
00126
00127
00128
00129
00136 template <typename C, typename F, typename E>
00137 class forward_complex_relative_iterator_base
00138 : public complex_relative_iterator_base<C, F, E>
00139 {
00140 typedef forward_complex_relative_iterator_base<C, F, E> self_;
00141 typedef complex_relative_iterator_base<C, F, E> super_;
00142
00143 public:
00144 typedef F face_type;
00145
00146 public:
00149 forward_complex_relative_iterator_base();
00150 template <typename Fref>
00151 forward_complex_relative_iterator_base(const Fref& f_ref);
00153
00154 public:
00158 bool is_valid() const;
00160 void invalidate();
00161
00163 void do_start_();
00165 void do_next_();
00166
00168 void update_f_();
00170
00171 protected:
00173 typename super_::adj_faces_t::const_iterator i_;
00174 };
00175
00176
00177
00178
00179
00180
00187 template <typename C, typename F, typename E>
00188 class backward_complex_relative_iterator_base
00189 : public complex_relative_iterator_base<C, F, E>
00190 {
00191 typedef backward_complex_relative_iterator_base<C, F, E> self_;
00192 typedef complex_relative_iterator_base<C, F, E> super_;
00193
00194 public:
00195 typedef F face_type;
00196
00197 public:
00200 backward_complex_relative_iterator_base();
00201 template <typename Fref>
00202 backward_complex_relative_iterator_base(const Fref& f_ref);
00204
00205 public:
00209 bool is_valid() const;
00211 void invalidate();
00212
00214 void do_start_();
00216 void do_next_();
00217
00219 void update_f_();
00221
00222 protected:
00224 typename super_::adj_faces_t::const_reverse_iterator i_;
00225 };
00226
00227
00228
00229 # ifndef MLN_INCLUDE_ONLY
00230
00231
00232
00233
00234
00235 template <typename C, typename F, typename E>
00236 inline
00237 complex_relative_iterator_base<C, F, E>::complex_relative_iterator_base()
00238 : c_(0)
00239 {
00240
00241 void (E::*m)() = & E::update_adj_faces_;
00242 m = 0;
00243
00244 exact(this)->invalidate();
00245 }
00246
00247 template <typename C, typename F, typename E>
00248 template <typename Fref>
00249 inline
00250 complex_relative_iterator_base<C, F, E>::complex_relative_iterator_base(const Fref& f_ref)
00251 {
00252
00253 void (E::*m)() = & E::update_adj_faces_;
00254 m = 0;
00255
00256 center_at(f_ref);
00257 }
00258
00259 template <typename C, typename F, typename E>
00260 inline
00261 void
00262 complex_relative_iterator_base<C, F, E>::center_at(const C& c)
00263 {
00264 c_ = &c;
00265 exact(this)->invalidate();
00266 }
00267
00268 template <typename C, typename F, typename E>
00269 inline
00270 void
00271 complex_relative_iterator_base<C, F, E>::start()
00272 {
00273 exact(this)->do_start_();
00274 if (exact(this)->is_valid())
00275 exact(this)->update_f_();
00276 }
00277
00278 template <typename C, typename F, typename E>
00279 inline
00280 void
00281 complex_relative_iterator_base<C, F, E>::next_()
00282 {
00283 exact(this)->do_next_();
00284 if (exact(this)->is_valid())
00285 exact(this)->update_f_();
00286 }
00287
00288
00289
00290
00291
00292
00293
00294 template <typename C, typename F, typename E>
00295 inline
00296 forward_complex_relative_iterator_base<C, F, E>::forward_complex_relative_iterator_base()
00297 {
00298 }
00299
00300 template <typename C, typename F, typename E>
00301 template <typename Fref>
00302 inline
00303 forward_complex_relative_iterator_base<C, F, E>::forward_complex_relative_iterator_base(const Fref& f_ref)
00304 : super_(f_ref)
00305 {
00306 }
00307
00308 template <typename C, typename F, typename E>
00309 inline
00310 bool
00311 forward_complex_relative_iterator_base<C, F, E>::is_valid() const
00312 {
00313 return i_ != this->adj_faces_.end();
00314 }
00315
00316 template <typename C, typename F, typename E>
00317 inline
00318 void
00319 forward_complex_relative_iterator_base<C, F, E>::invalidate()
00320 {
00321 i_ = this->adj_faces_.end();
00322 }
00323
00324 template <typename C, typename F, typename E>
00325 inline
00326 void
00327 forward_complex_relative_iterator_base<C, F, E>::do_start_()
00328 {
00329 exact(this)->update_adj_faces_();
00330 i_ = this->adj_faces_.begin();
00331 }
00332
00333 template <typename C, typename F, typename E>
00334 inline
00335 void
00336 forward_complex_relative_iterator_base<C, F, E>::do_next_()
00337 {
00338 ++i_;
00339 }
00340
00341 template <typename C, typename F, typename E>
00342 inline
00343 void
00344 forward_complex_relative_iterator_base<C, F, E>::update_f_()
00345 {
00346 mln_precondition(is_valid());
00347 this->f_ = *i_;
00348 }
00349
00350
00351
00352
00353
00354
00355 template <typename C, typename F, typename E>
00356 inline
00357 backward_complex_relative_iterator_base<C, F, E>::backward_complex_relative_iterator_base()
00358 {
00359 }
00360
00361 template <typename C, typename F, typename E>
00362 template <typename Fref>
00363 inline
00364 backward_complex_relative_iterator_base<C, F, E>::backward_complex_relative_iterator_base(const Fref& f_ref)
00365 : super_(f_ref)
00366 {
00367 }
00368
00369 template <typename C, typename F, typename E>
00370 inline
00371 bool
00372 backward_complex_relative_iterator_base<C, F, E>::is_valid() const
00373 {
00374 return i_ != this->adj_faces_.rend();
00375 }
00376
00377 template <typename C, typename F, typename E>
00378 inline
00379 void
00380 backward_complex_relative_iterator_base<C, F, E>::invalidate()
00381 {
00382 i_ = this->adj_faces_.rend();
00383 }
00384
00385 template <typename C, typename F, typename E>
00386 inline
00387 void
00388 backward_complex_relative_iterator_base<C, F, E>::do_start_()
00389 {
00390 exact(this)->update_adj_faces_();
00391 i_ = this->adj_faces_.rbegin();
00392 }
00393
00394 template <typename C, typename F, typename E>
00395 inline
00396 void
00397 backward_complex_relative_iterator_base<C, F, E>::do_next_()
00398 {
00399 ++i_;
00400 }
00401
00402 template <typename C, typename F, typename E>
00403 inline
00404 void
00405 backward_complex_relative_iterator_base<C, F, E>::update_f_()
00406 {
00407 mln_precondition(is_valid());
00408 this->f_ = *i_;
00409 }
00410
00411 # endif // ! MLN_INCLUDE_ONLY
00412
00413 }
00414
00415 }
00416
00417 }
00418
00419 #endif // ! MLN_TOPO_INTERNAL_COMPLEX_RELATIVE_ITERATOR_BASE_HH