26 #ifndef MLN_TOPO_N_FACE_HH
27 # define MLN_TOPO_N_FACE_HH
36 # include <mln/value/internal/limits.hh>
37 # include <mln/core/contract.hh>
38 # include <mln/metal/bool.hh>
47 template <
unsigned D>
class complex;
48 template <
unsigned N,
unsigned D>
class face_data;
49 template <
unsigned N,
unsigned D>
class algebraic_n_face;
60 template <
unsigned N,
unsigned D>
126 template <
unsigned N,
unsigned D>
133 template <
unsigned N,
unsigned D>
142 template <
unsigned N,
unsigned D>
149 template <
unsigned N,
unsigned D>
151 operator<<(std::ostream& ostr, const n_face<N, D>& f);
155 # ifndef MLN_INCLUDE_ONLY
157 template <
unsigned N,
unsigned D>
163 metal::bool_< N <= D >::check();
167 template <
unsigned N,
unsigned D>
170 : cplx_(c), face_id_(face_id)
173 metal::bool_< N <= D >::check();
176 template <
unsigned N,
unsigned D>
181 return face_id_ < cplx_.template nfaces_of_static_dim<N>();
184 template <
unsigned N,
unsigned D>
192 template <
unsigned N,
unsigned D>
200 template <
unsigned N,
unsigned D>
208 template <
unsigned N,
unsigned D>
216 template <
unsigned N,
unsigned D>
224 template <
unsigned N,
unsigned D>
232 template <
unsigned N,
unsigned D>
240 template <
unsigned N,
unsigned D>
248 template <
unsigned N,
unsigned D>
253 mln_precondition(is_valid());
254 return cplx_.template face_data_<N>(face_id_);
257 template <
unsigned N,
unsigned D>
259 std::vector< algebraic_n_face<N - 1, D> >
262 mln_precondition(N > 0);
263 mln_precondition(is_valid());
264 return cplx_.template face_data_<N>(face_id_).lower_dim_faces_;
267 template <
unsigned N,
unsigned D>
269 std::vector< algebraic_n_face<N + 1, D> >
272 mln_precondition(N <= D);
273 mln_precondition(is_valid());
274 return cplx_.template face_data_<N>(face_id_).higher_dim_faces_;
278 template <
unsigned N,
unsigned D>
284 mln_precondition(lhs.cplx() == rhs.cplx());
285 return lhs.face_id() == rhs.face_id();
288 template <
unsigned N,
unsigned D>
294 mln_precondition(lhs.cplx() == rhs.cplx());
295 return !(lhs ==
rhs);
298 template <
unsigned N,
unsigned D>
304 mln_precondition(lhs.cplx() == rhs.cplx());
305 return lhs.face_id() < rhs.face_id();
309 template <
unsigned N,
unsigned D>
312 operator<<(std::ostream& ostr, const n_face<N, D>& f)
314 return ostr <<
"(cplx = " << f.cplx().addr() <<
", dim = " << f.n()
315 <<
", id = " << f.face_id() <<
')';
318 # endif // ! MLN_INCLUDE_ONLY
324 #endif // ! MLN_TOPO_N_FACE_HH