27 #ifndef MLN_UTIL_SET_HH
28 # define MLN_UTIL_SET_HH
44 # include <mln/core/concept/proxy.hh>
45 # include <mln/util/ord.hh>
55 template <
typename T>
class set_fwd_iter;
56 template <
typename T>
class set_bkd_iter;
116 template <
typename U>
177 bool has(
const T& elt)
const;
208 mutable std::vector<T> v_;
214 mutable std::set< T, util::ord<T> > s_;
220 void freeze_()
const;
224 void unfreeze_()
const;
227 mutable bool frozen_;
231 bool v_has_(
const T& elt)
const;
232 unsigned dicho_(
const T& elt,
unsigned beg,
unsigned end)
const;
236 template <
typename T>
240 template <
typename T>
241 bool operator < (const set<T>& lhs,
const set<T>&
rhs);
244 template <
typename T>
245 bool operator <= (const set<T>& lhs,
const set<T>&
rhs);
251 template <
typename T>
253 public mln::internal::proxy_impl< const T&, set_fwd_iter<T> >
297 template <
typename T>
299 public mln::internal::proxy_impl< const T&, set_bkd_iter<T> >
340 # ifndef MLN_INCLUDE_ONLY
346 template <
typename T>
353 template <
typename T>
358 if (frozen_) unfreeze_();
363 template <
typename T>
364 template <
typename U>
369 if (other.is_empty())
372 if (frozen_) unfreeze_();
373 s_.insert(other.std_vector().begin(), other.std_vector().end());
377 template <
typename T>
382 if (frozen_) unfreeze_();
387 template <
typename T>
394 mln_invariant(s_.empty());
400 mln_invariant(v_.empty());
403 mln_postcondition(is_empty());
406 template <
typename T>
411 return frozen_ ? v_.size() : s_.size();
414 template <
typename T>
420 if (! frozen_) freeze_();
424 template <
typename T>
429 mln_precondition(! is_empty());
430 return frozen_ ? *v_.begin() : *s_.begin();
433 template <
typename T>
438 mln_precondition(! is_empty());
439 return frozen_ ? *v_.rbegin() : *s_.rbegin();
442 template <
typename T>
447 return frozen_ ? v_has_(elt) : s_.
find(elt) != s_.end();
450 template <
typename T>
458 template <
typename T>
460 const std::vector<T>&
463 if (! frozen_) freeze_();
467 template <
typename T>
470 set<T>::freeze_()
const
472 mln_precondition(frozen_ ==
false);
473 mln_invariant(v_.empty());
474 std::copy(s_.begin(), s_.end(), std::back_inserter(v_));
479 template <
typename T>
482 set<T>::unfreeze_()
const
484 mln_precondition(frozen_ ==
true);
485 mln_invariant(s_.empty());
486 s_.insert(v_.begin(), v_.end());
491 template <
typename T>
499 template <
typename T>
507 template <
typename T>
510 set<T>::v_has_(
const T& elt)
const
512 mln_precondition(frozen_);
517 return v_[dicho_(elt, 0,
nelements())] == elt;
520 template <
typename T>
523 set<T>::dicho_(
const T& elt,
unsigned beg,
unsigned end)
const
525 mln_precondition(frozen_);
526 mln_precondition(beg <= end);
529 unsigned med = (beg + end) / 2;
531 ? dicho_(elt, beg, med)
532 : dicho_(elt, med, end);
540 template <
typename T>
547 template <
typename T>
554 template <
typename T>
563 template <
typename T>
568 mln_precondition(s_ != 0);
572 template <
typename T>
577 mln_precondition(is_valid());
581 template <
typename T>
586 return s_ != 0 && i_ != s_->nelements();
589 template <
typename T>
595 i_ = s_->nelements();
596 mln_postcondition(! is_valid());
599 template <
typename T>
604 mln_precondition(is_valid());
605 return s_->operator[](i_);
608 template <
typename T>
613 mln_precondition(is_valid());
614 return s_->operator[](i_);
617 template <
typename T>
630 template <
typename T>
637 template <
typename T>
644 template <
typename T>
653 template <
typename T>
658 mln_precondition(s_ != 0);
659 if (! s_->is_empty())
660 i_ = s_->nelements() - 1;
663 template <
typename T>
668 mln_precondition(is_valid());
675 template <
typename T>
680 return s_ != 0 && i_ != s_->nelements();
683 template <
typename T>
689 i_ = s_->nelements();
690 mln_postcondition(! is_valid());
693 template <
typename T>
698 mln_precondition(is_valid());
699 return s_->operator[](i_);
702 template <
typename T>
707 mln_precondition(is_valid());
708 return s_->operator[](i_);
711 template <
typename T>
723 template <
typename T>
729 for (
unsigned i = 0; i < n; ++i)
739 template <
typename T>
742 const unsigned n = lhs.nelements();
743 if (rhs.nelements() != n)
745 for (
unsigned i = 0; i < n; ++i)
746 if (lhs[i] != rhs[i])
751 template <
typename T>
752 bool operator < (const set<T>& lhs,
const set<T>&
rhs)
754 return lhs.nelements() < rhs.nelements() && lhs <=
rhs;
757 template <
typename T>
758 bool operator <= (const set<T>& lhs,
const set<T>&
rhs)
761 nl = lhs.nelements(),
762 nr = rhs.nelements();
766 for (
unsigned l = 0, r = 0; l < nl; ++l, ++r)
768 while (rhs[r] != lhs[l] && r < nr)
776 # endif // ! MLN_INCLUDE_ONLY
783 #endif // ! MLN_UTIL_SET_HH