26 #ifndef MLN_TOPO_INTERNAL_COMPLEX_RELATIVE_ITERATOR_BASE_HH
27 # define MLN_TOPO_INTERNAL_COMPLEX_RELATIVE_ITERATOR_BASE_HH
51 # include <mln/topo/internal/complex_iterator_base.hh>
70 template <
typename F,
typename E>
71 class complex_iterator_base;
83 template <
typename C,
typename F,
typename E>
84 class complex_relative_iterator_base :
85 public complex_iterator_base<F, E>
87 typedef complex_relative_iterator_base<C, F, E> self_;
91 typedef C center_type;
97 complex_relative_iterator_base();
98 template <
typename Fref>
99 complex_relative_iterator_base(
const Fref& f_ref);
105 void center_at(
const center_type& c);
116 const center_type* c_;
119 typedef std::vector<face_type> adj_faces_t;
121 adj_faces_t adj_faces_;
136 template <
typename C,
typename F,
typename E>
137 class forward_complex_relative_iterator_base
138 :
public complex_relative_iterator_base<C, F, E>
140 typedef forward_complex_relative_iterator_base<C, F, E> self_;
141 typedef complex_relative_iterator_base<C, F, E> super_;
149 forward_complex_relative_iterator_base();
150 template <
typename Fref>
151 forward_complex_relative_iterator_base(
const Fref& f_ref);
158 bool is_valid()
const;
173 typename super_::adj_faces_t::const_iterator i_;
187 template <
typename C,
typename F,
typename E>
188 class backward_complex_relative_iterator_base
189 :
public complex_relative_iterator_base<C, F, E>
191 typedef backward_complex_relative_iterator_base<C, F, E> self_;
192 typedef complex_relative_iterator_base<C, F, E> super_;
200 backward_complex_relative_iterator_base();
201 template <
typename Fref>
202 backward_complex_relative_iterator_base(
const Fref& f_ref);
209 bool is_valid()
const;
224 typename super_::adj_faces_t::const_reverse_iterator i_;
229 # ifndef MLN_INCLUDE_ONLY
235 template <
typename C,
typename F,
typename E>
237 complex_relative_iterator_base<C, F, E>::complex_relative_iterator_base()
241 void (E::*m)() = & E::update_adj_faces_;
244 exact(
this)->invalidate();
247 template <
typename C,
typename F,
typename E>
248 template <
typename Fref>
250 complex_relative_iterator_base<C, F, E>::complex_relative_iterator_base(
const Fref& f_ref)
253 void (E::*m)() = & E::update_adj_faces_;
259 template <
typename C,
typename F,
typename E>
262 complex_relative_iterator_base<C, F, E>::center_at(
const C& c)
265 exact(
this)->invalidate();
268 template <
typename C,
typename F,
typename E>
271 complex_relative_iterator_base<C, F, E>::start()
273 exact(
this)->do_start_();
274 if (exact(
this)->is_valid())
275 exact(
this)->update_f_();
278 template <
typename C,
typename F,
typename E>
281 complex_relative_iterator_base<C, F, E>::next_()
283 exact(
this)->do_next_();
284 if (exact(
this)->is_valid())
285 exact(
this)->update_f_();
294 template <
typename C,
typename F,
typename E>
296 forward_complex_relative_iterator_base<C, F, E>::forward_complex_relative_iterator_base()
300 template <
typename C,
typename F,
typename E>
301 template <
typename Fref>
303 forward_complex_relative_iterator_base<C, F, E>::forward_complex_relative_iterator_base(
const Fref& f_ref)
308 template <
typename C,
typename F,
typename E>
311 forward_complex_relative_iterator_base<C, F, E>::is_valid()
const
313 return i_ != this->adj_faces_.end();
316 template <
typename C,
typename F,
typename E>
319 forward_complex_relative_iterator_base<C, F, E>::invalidate()
321 i_ = this->adj_faces_.end();
324 template <
typename C,
typename F,
typename E>
327 forward_complex_relative_iterator_base<C, F, E>::do_start_()
329 exact(
this)->update_adj_faces_();
330 i_ = this->adj_faces_.begin();
333 template <
typename C,
typename F,
typename E>
336 forward_complex_relative_iterator_base<C, F, E>::do_next_()
341 template <
typename C,
typename F,
typename E>
344 forward_complex_relative_iterator_base<C, F, E>::update_f_()
346 mln_precondition(is_valid());
355 template <
typename C,
typename F,
typename E>
357 backward_complex_relative_iterator_base<C, F, E>::backward_complex_relative_iterator_base()
361 template <
typename C,
typename F,
typename E>
362 template <
typename Fref>
364 backward_complex_relative_iterator_base<C, F, E>::backward_complex_relative_iterator_base(
const Fref& f_ref)
369 template <
typename C,
typename F,
typename E>
372 backward_complex_relative_iterator_base<C, F, E>::is_valid()
const
374 return i_ != this->adj_faces_.rend();
377 template <
typename C,
typename F,
typename E>
380 backward_complex_relative_iterator_base<C, F, E>::invalidate()
382 i_ = this->adj_faces_.rend();
385 template <
typename C,
typename F,
typename E>
388 backward_complex_relative_iterator_base<C, F, E>::do_start_()
390 exact(
this)->update_adj_faces_();
391 i_ = this->adj_faces_.rbegin();
394 template <
typename C,
typename F,
typename E>
397 backward_complex_relative_iterator_base<C, F, E>::do_next_()
402 template <
typename C,
typename F,
typename E>
405 backward_complex_relative_iterator_base<C, F, E>::update_f_()
407 mln_precondition(is_valid());
411 # endif // ! MLN_INCLUDE_ONLY
419 #endif // ! MLN_TOPO_INTERNAL_COMPLEX_RELATIVE_ITERATOR_BASE_HH