26 #ifndef MLN_CORE_SITE_SET_OPERATORS_HH
27 # define MLN_CORE_SITE_SET_OPERATORS_HH
37 # include <mln/core/concept/site_set.hh>
45 template <
typename E>
struct Box;
49 template <
typename Sl,
typename Sr>
61 template <
typename Sl,
typename Sr>
74 template <
typename Sl,
typename Sr>
76 operator<=(const Site_Set<Sl>& lhs,
const Site_Set<Sr>& rhs);
88 template <
typename Sl,
typename Sr>
90 operator<(const Site_Set<Sl>& lhs,
const Site_Set<Sr>& rhs);
104 template <
typename S>
106 operator<<(std::ostream& ostr, const Site_Set<S>&
set);
110 # ifndef MLN_INCLUDE_ONLY
116 template <
typename Sl,
typename Sr>
118 std::set< mln_site(Sl), util::ord<mln_site(Sl)> >
121 typedef mln_site(Sl) P;
122 mlc_converts_to(mln_psite(Sr), P)::check();
123 std::
set< P, util::ord<P> > sl, sr, sd;
124 convert::over_load::from_to_(lhs, sl);
125 convert::over_load::from_to_(rhs, sr);
126 std::set_symmetric_difference(sl.begin(), sl.end(),
127 sr.begin(), sr.end(),
128 std::inserter(sd, sd.begin()),
133 template <typename S>
135 std::
set< mln_site(S), util::ord<mln_site(S)> >
138 std::set< mln_site(S), util::ord<mln_site(S)> > std_s;
139 convert::over_load::from_to_(s, std_s);
143 template <
typename Sl,
typename Sr>
146 leq_std_set(
const Site_Set<Sl>& lhs,
const Site_Set<Sr>& rhs)
148 typedef mln_site(Sl) P;
149 mlc_converts_to(mln_psite(Sr), P)::check();
150 std::set< P, util::ord<P> > sl, sr;
151 convert::over_load::from_to_(lhs, sl);
152 convert::over_load::from_to_(rhs, sr);
153 return std::includes(sr.begin(), sr.end(),
154 sl.begin(), sl.end(),
161 template <typename S>
163 unsigned set_card_dispatch_(mln::trait::site_set::nsites::any,
173 template <typename S>
175 unsigned set_card_dispatch_(mln::trait::site_set::nsites::known,
181 template <
typename S>
183 unsigned set_card(
const Site_Set<S>& s)
185 return set_card_dispatch_(mln_trait_site_set_nsites(S)(),
197 template <
typename Bl,
typename Br>
200 operator_equal_boxes(
const Box<Bl>& lhs_,
const Box<Br>& rhs_)
202 const Bl& lhs = exact(lhs_);
203 const Br& rhs = exact(rhs_);
204 if (lhs.is_empty() != rhs.is_empty())
206 if (lhs.is_empty() && rhs.is_empty())
208 return lhs.pmin() == rhs.pmin() && lhs.pmax() == rhs.pmax();
211 template <
typename Sl,
typename Sr>
214 operator_equal_uniques(
const Site_Set<Sl>& lhs,
215 const Site_Set<Sr>& rhs)
217 if (internal::set_card(lhs) != internal::set_card(rhs))
219 return mln::internal::sym_diff_std_set(lhs, rhs).empty();
222 template <
typename Sl,
typename Sr>
225 operator_equal_unique_multiple(
const Site_Set<Sl>& lhs,
226 const Site_Set<Sr>& rhs)
228 if (internal::set_card(lhs) != internal::set_card(rhs))
230 return mln::internal::to_std_set(lhs) == mln::internal::to_std_set(rhs);
233 template <
typename Sl,
typename Sr>
236 operator_equal_multiples(
const Site_Set<Sl>& lhs,
237 const Site_Set<Sr>& rhs)
240 if (internal::set_card(lhs) != internal::set_card(rhs))
242 return mln::internal::to_std_set(lhs) == mln::internal::to_std_set(rhs);
248 template <
typename Bl,
typename Br>
251 operator_less_boxes(
const Box<Bl>& lhs_,
const Box<Br>& rhs_)
253 const Bl& lhs = exact(lhs_);
254 const Br& rhs = exact(rhs_);
261 if (internal::set_card(lhs) >= internal::set_card(rhs))
263 return lhs.crop_wrt(rhs) == lhs;
266 template <
typename Sl,
typename Sr>
269 operator_less_uniques(
const Site_Set<Sl>& lhs,
270 const Site_Set<Sr>& rhs)
272 if (internal::set_card(lhs) >= internal::set_card(rhs))
274 return mln::internal::leq_std_set(lhs, rhs);
277 template <
typename Sl,
typename Sr>
280 operator_less_unique_multiple(
const Site_Set<Sl>& lhs,
281 const Site_Set<Sr>& rhs)
283 if (internal::set_card(lhs) >= internal::set_card(rhs))
285 return mln::internal::leq_std_set(lhs, rhs);
288 template <
typename Sl,
typename Sr>
291 operator_less_multiples(
const Site_Set<Sl>& lhs,
292 const Site_Set<Sr>& rhs)
295 if (internal::set_card(lhs) >= internal::set_card(rhs))
297 return mln::internal::leq_std_set(lhs, rhs);
310 template <
typename Sl,
typename Sr>
313 operator_equal_dispatch(trait::site_set::arity::unique,
315 trait::site_set::arity::unique,
318 return impl::operator_equal_boxes(lhs, rhs);
321 template <
typename Sl,
typename Sr>
324 operator_equal_dispatch(trait::site_set::arity::unique,
325 const Site_Set<Sl>& lhs,
326 trait::site_set::arity::unique,
327 const Site_Set<Sr>& rhs)
329 return impl::operator_equal_uniques(lhs, rhs);
332 template <
typename Sl,
typename Sr>
335 operator_equal_dispatch(trait::site_set::arity::unique,
336 const Site_Set<Sl>& lhs,
337 trait::site_set::arity::multiple,
338 const Site_Set<Sr>& rhs)
340 return impl::operator_equal_unique_multiple(lhs, rhs);
343 template <
typename Sl,
typename Sr>
346 operator_equal_dispatch(trait::site_set::arity::multiple,
347 const Site_Set<Sl>& lhs,
348 trait::site_set::arity::unique,
349 const Site_Set<Sr>& rhs)
351 return impl::operator_equal_unique_multiple(rhs, lhs);
354 template <
typename Sl,
typename Sr>
357 operator_equal_dispatch(trait::site_set::arity::multiple,
358 const Site_Set<Sl>& lhs,
359 trait::site_set::arity::multiple,
360 const Site_Set<Sr>& rhs)
362 return impl::operator_equal_multiples(lhs, rhs);
365 template <
typename Sl,
typename Sr>
368 operator_equal_dispatch(
const Site_Set<Sl>& lhs,
const Site_Set<Sr>& rhs)
370 return operator_equal_dispatch(mln_trait_site_set_arity(Sl)(), exact(lhs),
371 mln_trait_site_set_arity(Sr)(), exact(rhs));
377 template <
typename Sl,
typename Sr>
380 operator_less_dispatch(trait::site_set::arity::unique,
382 trait::site_set::arity::unique,
385 return impl::operator_less_boxes(lhs, rhs);
388 template <
typename Sl,
typename Sr>
391 operator_less_dispatch(trait::site_set::arity::unique,
392 const Site_Set<Sl>& lhs,
393 trait::site_set::arity::unique,
394 const Site_Set<Sr>& rhs)
396 return impl::operator_less_uniques(lhs, rhs);
399 template <
typename Sl,
typename Sr>
402 operator_less_dispatch(trait::site_set::arity::unique,
403 const Site_Set<Sl>& lhs,
404 trait::site_set::arity::multiple,
405 const Site_Set<Sr>& rhs)
407 return impl::operator_less_unique_multiple(lhs, rhs);
410 template <
typename Sl,
typename Sr>
413 operator_less_dispatch(trait::site_set::arity::multiple,
414 const Site_Set<Sl>& lhs,
415 trait::site_set::arity::unique,
416 const Site_Set<Sr>& rhs)
418 return impl::operator_less_unique_multiple(rhs, lhs);
421 template <
typename Sl,
typename Sr>
424 operator_less_dispatch(trait::site_set::arity::multiple,
425 const Site_Set<Sl>& lhs,
426 trait::site_set::arity::multiple,
427 const Site_Set<Sr>& rhs)
429 return impl::operator_less_multiples(lhs, rhs);
432 template <
typename Sl,
typename Sr>
435 operator_less_dispatch(
const Site_Set<Sl>& lhs,
const Site_Set<Sr>& rhs)
437 return operator_less_dispatch(mln_trait_site_set_arity(Sl)(), exact(lhs),
438 mln_trait_site_set_arity(Sr)(), exact(rhs));
446 template <
typename Sl,
typename Sr>
449 operator+=(Site_Set<Sl>& lhs_,
const Site_Set<Sr>& rhs)
451 mlc_is( mln_trait_site_set_contents(Sl),
452 mln::trait::site_set::contents::dynamic )::check();
453 mlc_equal(mln_site(Sr),
typename Sl::i_element)::check();
454 Sl& lhs = exact(lhs_);
455 mln_fwd_piter(Sr) p(exact(rhs));
464 template <typename Sl, typename Sr>
469 mlc_equal(mln_site(Sl), mln_site(Sr))::check();
470 return internal::operator_equal_dispatch(lhs, rhs);
476 template <
typename Sl,
typename Sr>
481 mlc_equal(mln_site(Sl), mln_site(Sr))::check();
482 return internal::operator_less_dispatch(lhs, rhs);
488 template <
typename Sl,
typename Sr>
493 mlc_equal(mln_site(Sl), mln_site(Sr))::check();
494 if (internal::set_card(lhs) > internal::set_card(rhs))
496 return lhs < rhs || lhs == rhs;
502 template <
typename S>
505 operator<<(std::ostream& ostr, const Site_Set<S>& set_)
507 const S&
set = exact(set_);
515 # endif // ! MLN_INCLUDE_ONLY
520 #endif // ! MLN_CORE_SITE_SET_OPERATORS_HH