27 #ifndef MLN_CORE_CONCEPT_SITE_SET_HH
28 # define MLN_CORE_CONCEPT_SITE_SET_HH
38 # include <mln/core/concept/site_iterator.hh>
39 # include <mln/trait/site_sets.hh>
40 # include <mln/metal/not_equal.hh>
41 # include <mln/metal/is_a.hh>
42 # include <mln/metal/is_unqualif.hh>
43 # include <mln/util/ord.hh>
50 template <
typename E>
struct Site_Set;
100 template <
typename S,
typename P,
typename C_>
113 template <
typename P,
typename C_,
typename S>
126 template <
typename S>
127 struct set_unary_< op::ord, Site_Set, S >
142 # ifndef MLN_INCLUDE_ONLY
152 template <
typename trait_nsites,
typename E>
153 struct site_set_nsites_check
155 static void run() { }
158 template <
typename E>
159 struct site_set_nsites_check< mln::trait::site_set::nsites::known, E >
170 template <
typename trait_bbox,
typename E>
171 struct site_set_bbox_check
175 typedef typename E::q_box q_box;
176 q_box (E::*m)()
const = &
E::bbox;
181 template <
typename E>
182 struct site_set_bbox_check< mln::trait::site_set::bbox::unknown, E >
184 static void run() { }
189 template <
typename trait_contents,
typename E>
190 struct site_set_contents_check;
192 template <
typename E>
193 struct site_set_contents_check< mln::trait::site_set::contents::fixed, E >
195 static void run() { }
198 template <
typename E>
199 struct site_set_contents_check< mln::trait::site_set::contents::growing, E >
203 typedef typename E::i_element i_element;
204 mlc_equal(mlc_unqualif(i_element), i_element)::check();
205 void (E::*m1)(
const i_element&) = & E::insert;
207 void (E::*m2)() = & E::clear;
212 template <
typename E>
213 struct site_set_contents_check< mln::trait::site_set::contents::free, E >
217 typedef typename E::i_element i_element;
218 mlc_equal(mlc_unqualif(i_element), i_element)::check();
219 void (E::*m1)(
const i_element&) = & E::insert;
221 typedef typename E::r_element r_element;
222 mlc_equal(mlc_unqualif(r_element), r_element)::check();
223 void (E::*m2)(
const r_element&) = & E::remove;
225 void (E::*m3)() = & E::clear;
234 template <
typename P>
struct box_;
236 template <
typename E>
249 typedef mln_element(E) element;
250 mlc_is_unqualif(element)::check();
251 typedef mln_site(E)
site;
252 typedef mln_psite(E)
psite;
253 typedef mln_piter(E) piter;
258 bool (E::*m1)(const psite&
p) const = & E::has;
260 bool (E::*m2)() const = & E::is_valid;
262 std::
size_t (E::*m3)() const = & E::memory_size;
266 internal::site_set_nsites_check < mln_trait_site_set_nsites(E), E >::run();
267 internal::site_set_bbox_check < mln_trait_site_set_bbox(E), E >::run();
268 internal::site_set_contents_check< mln_trait_site_set_contents(E), E >::run();
274 template <typename S, typename P, typename C_>
277 from_to_(const Site_Set<S>& from_, std::set<P,C_>& to)
279 mlc_converts_to(mln_psite(S), P)::check();
280 const S& from =
exact(from_);
282 mln_piter(S)
p(from);
292 template <
typename P,
typename C_,
typename S>
297 mlc_converts_to(P, mln_i_element(S))::check();
300 for (
typename set<P>::const_iterator i = from.begin();
309 # endif // ! MLN_INCLUDE_ONLY
312 # include <mln/core/site_set/operators.hh>
313 # include <mln/core/routine/ops.hh>
316 #endif // ! MLN_CORE_CONCEPT_SITE_SET_HH