27 #ifndef MLN_TOPO_INTERNAL_COMPLEX_RELATIVE_ITERATOR_BASE_HH
28 # define MLN_TOPO_INTERNAL_COMPLEX_RELATIVE_ITERATOR_BASE_HH
52 # include <mln/topo/internal/complex_iterator_base.hh>
71 template <
typename F,
typename E>
72 class complex_iterator_base;
87 template <
typename C,
typename F,
typename E>
102 template <
typename Fref>
143 template <
typename C,
typename F,
typename E>
157 template <
typename Fref>
180 typename super_::adj_faces_t::const_iterator
i_;
197 template <
typename C,
typename F,
typename E>
211 template <
typename Fref>
234 typename super_::adj_faces_t::const_reverse_iterator
i_;
239 # ifndef MLN_INCLUDE_ONLY
245 template <
typename C,
typename F,
typename E>
251 void (E::*m)() = & E::update_adj_faces_;
254 exact(
this)->invalidate();
257 template <
typename C,
typename F,
typename E>
258 template <
typename Fref>
260 complex_relative_iterator_base<C, F, E>::complex_relative_iterator_base(
const Fref& f_ref)
263 void (E::*m)() = & E::update_adj_faces_;
269 template <
typename C,
typename F,
typename E>
272 complex_relative_iterator_base<C, F, E>::center_at(
const C& c)
275 exact(
this)->invalidate();
278 template <
typename C,
typename F,
typename E>
281 complex_relative_iterator_base<C, F, E>::start()
283 exact(
this)->do_start_();
284 if (exact(
this)->is_valid())
285 exact(
this)->update_f_();
288 template <
typename C,
typename F,
typename E>
291 complex_relative_iterator_base<C, F, E>::next_()
293 exact(
this)->do_next_();
294 if (
exact(
this)->is_valid())
295 exact(
this)->update_f_();
304 template <
typename C,
typename F,
typename E>
306 forward_complex_relative_iterator_base<C, F, E>::forward_complex_relative_iterator_base()
310 template <
typename C,
typename F,
typename E>
311 template <
typename Fref>
313 forward_complex_relative_iterator_base<C, F, E>::forward_complex_relative_iterator_base(
const Fref& f_ref)
318 template <
typename C,
typename F,
typename E>
321 forward_complex_relative_iterator_base<C, F, E>::is_valid()
const
323 return i_ != this->adj_faces_.end();
326 template <
typename C,
typename F,
typename E>
329 forward_complex_relative_iterator_base<C, F, E>::invalidate()
331 i_ = this->adj_faces_.end();
334 template <
typename C,
typename F,
typename E>
337 forward_complex_relative_iterator_base<C, F, E>::do_start_()
339 exact(
this)->update_adj_faces_();
340 i_ = this->adj_faces_.begin();
343 template <
typename C,
typename F,
typename E>
346 forward_complex_relative_iterator_base<C, F, E>::do_next_()
351 template <
typename C,
typename F,
typename E>
354 forward_complex_relative_iterator_base<C, F, E>::update_f_()
356 mln_precondition(is_valid());
365 template <
typename C,
typename F,
typename E>
367 backward_complex_relative_iterator_base<C, F, E>::backward_complex_relative_iterator_base()
371 template <
typename C,
typename F,
typename E>
372 template <
typename Fref>
374 backward_complex_relative_iterator_base<C, F, E>::backward_complex_relative_iterator_base(
const Fref& f_ref)
379 template <
typename C,
typename F,
typename E>
382 backward_complex_relative_iterator_base<C, F, E>::is_valid()
const
384 return i_ != this->adj_faces_.rend();
387 template <
typename C,
typename F,
typename E>
390 backward_complex_relative_iterator_base<C, F, E>::invalidate()
392 i_ = this->adj_faces_.rend();
395 template <
typename C,
typename F,
typename E>
398 backward_complex_relative_iterator_base<C, F, E>::do_start_()
400 exact(
this)->update_adj_faces_();
401 i_ = this->adj_faces_.rbegin();
404 template <
typename C,
typename F,
typename E>
407 backward_complex_relative_iterator_base<C, F, E>::do_next_()
412 template <
typename C,
typename F,
typename E>
415 backward_complex_relative_iterator_base<C, F, E>::update_f_()
417 mln_precondition(is_valid());
421 # endif // ! MLN_INCLUDE_ONLY
429 #endif // ! MLN_TOPO_INTERNAL_COMPLEX_RELATIVE_ITERATOR_BASE_HH