27 #ifndef MLN_CORE_SITE_SET_OPERATORS_HH
28 # define MLN_CORE_SITE_SET_OPERATORS_HH
38 # include <mln/core/concept/site_set.hh>
46 template <
typename E>
struct Box;
50 template <
typename Sl,
typename Sr>
62 template <
typename Sl,
typename Sr>
75 template <
typename Sl,
typename Sr>
89 template <
typename Sl,
typename Sr>
105 template <
typename S>
107 operator<<(std::ostream& ostr, const Site_Set<S>&
set);
111 # ifndef MLN_INCLUDE_ONLY
117 template <
typename Sl,
typename Sr>
119 std::set< mln_site(Sl), util::ord<mln_site(Sl)> >
122 typedef mln_site(Sl) P;
123 mlc_converts_to(mln_psite(Sr), P)::check();
124 std::
set< P, util::ord<P> > sl, sr, sd;
127 std::set_symmetric_difference(sl.begin(), sl.end(),
128 sr.begin(), sr.end(),
129 std::inserter(sd, sd.begin()),
134 template <typename S>
136 std::
set< mln_site(S), util::ord<mln_site(S)> >
139 std::set< mln_site(S), util::ord<mln_site(S)> > std_s;
144 template <
typename Sl,
typename Sr>
147 leq_std_set(
const Site_Set<Sl>& lhs,
const Site_Set<Sr>& rhs)
149 typedef mln_site(Sl) P;
150 mlc_converts_to(mln_psite(Sr), P)::check();
151 std::set< P, util::ord<P> > sl, sr;
154 return std::includes(sr.begin(), sr.end(),
155 sl.begin(), sl.end(),
162 template <typename S>
174 template <typename S>
182 template <
typename S>
184 unsigned set_card(
const Site_Set<S>& s)
186 return set_card_dispatch_(mln_trait_site_set_nsites(S)(),
198 template <
typename Bl,
typename Br>
201 operator_equal_boxes(
const Box<Bl>& lhs_,
const Box<Br>& rhs_)
203 const Bl& lhs =
exact(lhs_);
204 const Br& rhs =
exact(rhs_);
205 if (lhs.is_empty() != rhs.is_empty())
207 if (lhs.is_empty() && rhs.is_empty())
209 return lhs.pmin() == rhs.pmin() && lhs.pmax() == rhs.pmax();
212 template <
typename Sl,
typename Sr>
215 operator_equal_uniques(
const Site_Set<Sl>& lhs,
216 const Site_Set<Sr>& rhs)
218 if (internal::set_card(lhs) != internal::set_card(rhs))
220 return mln::internal::sym_diff_std_set(lhs, rhs).empty();
223 template <
typename Sl,
typename Sr>
226 operator_equal_unique_multiple(
const Site_Set<Sl>& lhs,
227 const Site_Set<Sr>& rhs)
229 if (internal::set_card(lhs) != internal::set_card(rhs))
231 return mln::internal::to_std_set(lhs) == mln::internal::to_std_set(rhs);
234 template <
typename Sl,
typename Sr>
237 operator_equal_multiples(
const Site_Set<Sl>& lhs,
238 const Site_Set<Sr>& rhs)
241 if (internal::set_card(lhs) != internal::set_card(rhs))
243 return mln::internal::to_std_set(lhs) == mln::internal::to_std_set(rhs);
249 template <
typename Bl,
typename Br>
252 operator_less_boxes(
const Box<Bl>& lhs_,
const Box<Br>& rhs_)
254 const Bl& lhs =
exact(lhs_);
255 const Br& rhs =
exact(rhs_);
262 if (internal::set_card(lhs) >= internal::set_card(rhs))
264 return lhs.crop_wrt(rhs) == lhs;
267 template <
typename Sl,
typename Sr>
270 operator_less_uniques(
const Site_Set<Sl>& lhs,
271 const Site_Set<Sr>& rhs)
273 if (internal::set_card(lhs) >= internal::set_card(rhs))
275 return mln::internal::leq_std_set(lhs, rhs);
278 template <
typename Sl,
typename Sr>
281 operator_less_unique_multiple(
const Site_Set<Sl>& lhs,
282 const Site_Set<Sr>& rhs)
284 if (internal::set_card(lhs) >= internal::set_card(rhs))
286 return mln::internal::leq_std_set(lhs, rhs);
289 template <
typename Sl,
typename Sr>
292 operator_less_multiples(
const Site_Set<Sl>& lhs,
293 const Site_Set<Sr>& rhs)
296 if (internal::set_card(lhs) >= internal::set_card(rhs))
298 return mln::internal::leq_std_set(lhs, rhs);
311 template <
typename Sl,
typename Sr>
314 operator_equal_dispatch(trait::site_set::arity::unique,
316 trait::site_set::arity::unique,
319 return impl::operator_equal_boxes(lhs, rhs);
322 template <
typename Sl,
typename Sr>
325 operator_equal_dispatch(trait::site_set::arity::unique,
326 const Site_Set<Sl>& lhs,
327 trait::site_set::arity::unique,
328 const Site_Set<Sr>& rhs)
330 return impl::operator_equal_uniques(lhs, rhs);
333 template <
typename Sl,
typename Sr>
336 operator_equal_dispatch(trait::site_set::arity::unique,
337 const Site_Set<Sl>& lhs,
338 trait::site_set::arity::multiple,
339 const Site_Set<Sr>& rhs)
341 return impl::operator_equal_unique_multiple(lhs, rhs);
344 template <
typename Sl,
typename Sr>
347 operator_equal_dispatch(trait::site_set::arity::multiple,
348 const Site_Set<Sl>& lhs,
349 trait::site_set::arity::unique,
350 const Site_Set<Sr>& rhs)
352 return impl::operator_equal_unique_multiple(rhs, lhs);
355 template <
typename Sl,
typename Sr>
358 operator_equal_dispatch(trait::site_set::arity::multiple,
359 const Site_Set<Sl>& lhs,
360 trait::site_set::arity::multiple,
361 const Site_Set<Sr>& rhs)
363 return impl::operator_equal_multiples(lhs, rhs);
366 template <
typename Sl,
typename Sr>
369 operator_equal_dispatch(
const Site_Set<Sl>& lhs,
const Site_Set<Sr>& rhs)
371 return operator_equal_dispatch(mln_trait_site_set_arity(Sl)(),
exact(lhs),
372 mln_trait_site_set_arity(Sr)(),
exact(rhs));
378 template <
typename Sl,
typename Sr>
381 operator_less_dispatch(trait::site_set::arity::unique,
383 trait::site_set::arity::unique,
386 return impl::operator_less_boxes(lhs, rhs);
389 template <
typename Sl,
typename Sr>
392 operator_less_dispatch(trait::site_set::arity::unique,
393 const Site_Set<Sl>& lhs,
394 trait::site_set::arity::unique,
395 const Site_Set<Sr>& rhs)
397 return impl::operator_less_uniques(lhs, rhs);
400 template <
typename Sl,
typename Sr>
403 operator_less_dispatch(trait::site_set::arity::unique,
404 const Site_Set<Sl>& lhs,
405 trait::site_set::arity::multiple,
406 const Site_Set<Sr>& rhs)
408 return impl::operator_less_unique_multiple(lhs, rhs);
411 template <
typename Sl,
typename Sr>
414 operator_less_dispatch(trait::site_set::arity::multiple,
415 const Site_Set<Sl>& lhs,
416 trait::site_set::arity::unique,
417 const Site_Set<Sr>& rhs)
419 return impl::operator_less_unique_multiple(rhs, lhs);
422 template <
typename Sl,
typename Sr>
425 operator_less_dispatch(trait::site_set::arity::multiple,
426 const Site_Set<Sl>& lhs,
427 trait::site_set::arity::multiple,
428 const Site_Set<Sr>& rhs)
430 return impl::operator_less_multiples(lhs, rhs);
433 template <
typename Sl,
typename Sr>
436 operator_less_dispatch(
const Site_Set<Sl>& lhs,
const Site_Set<Sr>& rhs)
438 return operator_less_dispatch(mln_trait_site_set_arity(Sl)(),
exact(lhs),
439 mln_trait_site_set_arity(Sr)(),
exact(rhs));
447 template <
typename Sl,
typename Sr>
450 operator+=(Site_Set<Sl>& lhs_,
const Site_Set<Sr>& rhs)
452 mlc_is( mln_trait_site_set_contents(Sl),
453 mln::trait::site_set::contents::dynamic )::check();
454 mlc_equal(mln_site(Sr),
typename Sl::i_element)::check();
455 Sl& lhs =
exact(lhs_);
456 mln_fwd_piter(Sr)
p(
exact(rhs));
465 template <typename Sl, typename Sr>
468 operator==(const Site_Set<Sl>& lhs, const Site_Set<Sr>& rhs)
470 mlc_equal(mln_site(Sl), mln_site(Sr))::check();
471 return internal::operator_equal_dispatch(lhs, rhs);
477 template <
typename Sl,
typename Sr>
480 operator<(const Site_Set<Sl>& lhs,
const Site_Set<Sr>&
rhs)
482 mlc_equal(mln_site(Sl), mln_site(Sr))::check();
483 return internal::operator_less_dispatch(lhs, rhs);
489 template <
typename Sl,
typename Sr>
492 operator<=(const Site_Set<Sl>& lhs,
const Site_Set<Sr>&
rhs)
494 mlc_equal(mln_site(Sl), mln_site(Sr))::check();
495 if (internal::set_card(lhs) > internal::set_card(rhs))
497 return lhs < rhs || lhs ==
rhs;
503 template <
typename S>
506 operator<<(std::ostream& ostr, const Site_Set<S>& set_)
508 const S&
set =
exact(set_);
516 # endif // ! MLN_INCLUDE_ONLY
521 #endif // ! MLN_CORE_SITE_SET_OPERATORS_HH