26 #ifndef MLN_CORE_CONCEPT_SITE_SET_HH
27 # define MLN_CORE_CONCEPT_SITE_SET_HH
37 # include <mln/core/concept/site_iterator.hh>
38 # include <mln/trait/site_sets.hh>
39 # include <mln/metal/not_equal.hh>
40 # include <mln/metal/is_a.hh>
41 # include <mln/metal/is_unqualif.hh>
42 # include <mln/util/ord.hh>
49 template <
typename E>
struct Site_Set;
96 template <
typename S,
typename P,
typename C_>
100 template <
typename P,
typename C_,
typename S>
113 template <
typename S>
114 struct set_unary_< op::ord, Site_Set, S >
129 # ifndef MLN_INCLUDE_ONLY
138 template <
typename S,
typename P,
typename C_>
141 from_to_(
const Site_Set<S>& from_, std::set<P,C_>&
to)
143 mlc_converts_to(mln_psite(S), P)::check();
144 const S& from = exact(from_);
146 mln_piter(S) p(from);
152 template <typename P, typename C_, typename S>
155 from_to_(const std::set<P,C_>& from, Site_Set<S>& to_)
157 mlc_converts_to(P, mln_i_element(S))::check();
160 for (
typename std::set<P>::const_iterator i = from.begin();
176 template <
typename trait_nsites,
typename E>
177 struct site_set_nsites_check
179 static void run() { }
182 template <
typename E>
183 struct site_set_nsites_check< mln::trait::site_set::nsites::known, E >
187 unsigned (E::*m)()
const = & E::nsites;
194 template <
typename trait_bbox,
typename E>
195 struct site_set_bbox_check
199 typedef typename E::q_box q_box;
200 q_box (E::*m)()
const = & E::bbox;
205 template <
typename E>
206 struct site_set_bbox_check< mln::trait::site_set::bbox::unknown, E >
208 static void run() { }
213 template <
typename trait_contents,
typename E>
214 struct site_set_contents_check;
216 template <
typename E>
217 struct site_set_contents_check< mln::trait::site_set::contents::fixed, E >
219 static void run() { }
222 template <
typename E>
223 struct site_set_contents_check< mln::trait::site_set::contents::growing, E >
227 typedef typename E::i_element i_element;
228 mlc_equal(mlc_unqualif(i_element), i_element)::check();
229 void (E::*m1)(
const i_element&) = & E::insert;
231 void (E::*m2)() = & E::clear;
236 template <
typename E>
237 struct site_set_contents_check< mln::trait::site_set::contents::free, E >
241 typedef typename E::i_element i_element;
242 mlc_equal(mlc_unqualif(i_element), i_element)::check();
243 void (E::*m1)(
const i_element&) = & E::insert;
245 typedef typename E::r_element r_element;
246 mlc_equal(mlc_unqualif(r_element), r_element)::check();
247 void (E::*m2)(
const r_element&) = & E::remove;
249 void (E::*m3)() = & E::clear;
258 template <
typename P>
struct box_;
260 template <
typename E>
262 Site_Set<E>::Site_Set()
265 mlc_not_equal( mln_trait_site_set_nsites(E), mln::trait::undef )::check();
266 mlc_not_equal( mln_trait_site_set_bbox(E), mln::trait::undef )::check();
267 mlc_not_equal( mln_trait_site_set_contents(E), mln::trait::undef )::check();
268 mlc_not_equal( mln_trait_site_set_arity(E), mln::trait::undef )::check();
273 typedef mln_element(E) element;
274 mlc_is_unqualif(element)::check();
275 typedef mln_site(E) site;
276 typedef mln_psite(E) psite;
277 typedef mln_piter(E) piter;
278 typedef mln_fwd_piter(E) fwd_piter;
279 typedef mln_bkd_piter(E) bkd_piter;
282 bool (E::*m1)(const psite& p) const = & E::has;
284 bool (E::*m2)() const = & E::is_valid;
286 std::
size_t (E::*m3)() const = & E::memory_size;
290 internal::site_set_nsites_check < mln_trait_site_set_nsites(E), E >::run();
291 internal::site_set_bbox_check < mln_trait_site_set_bbox(E), E >::run();
292 internal::site_set_contents_check< mln_trait_site_set_contents(E), E >::run();
295 # endif // ! MLN_INCLUDE_ONLY
300 # include <mln/core/site_set/operators.hh>
301 # include <mln/core/routine/ops.hh>
304 #endif // ! MLN_CORE_CONCEPT_SITE_SET_HH