26 #ifndef MLN_TOPO_INTERNAL_COMPLEX_RELATIVE_ITERATOR_SEQUENCE_HH
27 # define MLN_TOPO_INTERNAL_COMPLEX_RELATIVE_ITERATOR_SEQUENCE_HH
36 # include <mln/metal/equal.hh>
38 # include <mln/core/concept/iterator.hh>
39 # include <mln/topo/complex.hh>
51 template <
typename I1>
52 struct const_face_type_
54 typedef typename I1::face_type F_;
55 typedef const F_& ret;
68 template <
typename I1,
typename I2,
typename E>
69 class complex_relative_iterator_sequence :
public Iterator<E>
71 typedef complex_relative_iterator_sequence<I1, I2, E> self_;
75 typedef typename I1::center_type center_type;
77 typedef typename I1::face_type face_type;
81 complex_relative_iterator_sequence();
82 template <
typename Fref>
83 complex_relative_iterator_sequence(
const Fref& f_ref);
89 void center_at(
const center_type& c);
92 bool is_valid()
const;
105 operator typename const_face_type_<I1>::ret ()
const;
125 template <
typename I1,
typename I2,
typename E>
129 const complex_relative_iterator_sequence<I1, I2, E>& p);
133 # ifndef MLN_INCLUDE_ONLY
135 template <
typename I1,
typename I2,
typename E>
137 complex_relative_iterator_sequence<I1, I2, E>::complex_relative_iterator_sequence()
140 mlc_equal(
typename I1::face_type,
typename I2::face_type)::check();
145 template <
typename I1,
typename I2,
typename E>
146 template <
typename Fref>
148 complex_relative_iterator_sequence<I1, I2, E>::complex_relative_iterator_sequence(
const Fref& f_ref)
151 mlc_equal(
typename I1::face_type,
typename I2::face_type)::check();
156 template <
typename I1,
typename I2,
typename E>
159 complex_relative_iterator_sequence<I1, I2, E>::center_at(
const center_type& c)
166 template <
typename I1,
typename I2,
typename E>
169 complex_relative_iterator_sequence<I1, I2, E>::is_valid()
const
171 return iter1_.is_valid() || iter2_.is_valid();
174 template <
typename I1,
typename I2,
typename E>
177 complex_relative_iterator_sequence<I1, I2, E>::invalidate()
183 template <
typename I1,
typename I2,
typename E>
186 complex_relative_iterator_sequence<I1, I2, E>::start()
194 template <
typename I1,
typename I2,
typename E>
197 complex_relative_iterator_sequence<I1, I2, E>::next_()
201 if (iter1_.is_valid())
209 template <
typename I1,
typename I2,
typename E>
212 complex_relative_iterator_sequence<I1, I2, E>::update_()
214 mln_precondition(is_valid());
215 if (iter1_.is_valid())
221 template <
typename I1,
typename I2,
typename E>
223 complex_relative_iterator_sequence<I1, I2, E>::operator
typename const_face_type_<I1>::ret ()
const
229 template <
typename I1,
typename I2,
typename E>
233 const complex_relative_iterator_sequence<I1, I2, E>& p)
235 return ostr <<
typename I1::face_type(p);
238 # endif // ! MLN_INCLUDE_ONLY
246 #endif // ! MLN_TOPO_INTERNAL_COMPLEX_RELATIVE_ITERATOR_SEQUENCE_HH