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>
128 set<T>&
remove(
const T& elt);
177 bool has(
const T& elt)
const;
199 bool is_frozen_()
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>
252 class set_fwd_iter :
public Proxy< set_fwd_iter<T> >,
253 public mln::internal::proxy_impl< const T&, set_fwd_iter<T> >
261 set_fwd_iter(
const set<T>& s);
264 void change_target(
const set<T>& s);
273 bool is_valid()
const;
279 const T& element()
const;
285 unsigned index_()
const;
297 template <
typename T>
298 class set_bkd_iter :
public Proxy< set_bkd_iter<T> >,
299 public mln::internal::proxy_impl< const T&, set_bkd_iter<T> >
307 set_bkd_iter(
const set<T>& s);
310 void change_target(
const set<T>& s);
319 bool is_valid()
const;
325 const T& element()
const;
331 unsigned index_()
const;
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>
372 if (frozen_) unfreeze_();
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>
419 mln_precondition(i < nelements());
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>
455 return nelements() == 0;
458 template <
typename T>
460 const std::vector<T>&
463 if (! frozen_) freeze_();
467 template <
typename T>
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>
484 mln_precondition(frozen_ ==
true);
485 mln_invariant(s_.empty());
486 s_.insert(v_.begin(), v_.end());
491 template <
typename T>
496 return nelements() *
sizeof(T);
499 template <
typename T>
507 template <
typename T>
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>
542 set_fwd_iter<T>::set_fwd_iter()
547 template <
typename T>
549 set_fwd_iter<T>::set_fwd_iter(
const set<T>& s)
554 template <
typename T>
557 set_fwd_iter<T>::change_target(
const set<T>& s)
563 template <
typename T>
566 set_fwd_iter<T>::start()
568 mln_precondition(s_ != 0);
572 template <
typename T>
575 set_fwd_iter<T>::next()
577 mln_precondition(is_valid());
581 template <
typename T>
584 set_fwd_iter<T>::is_valid()
const
586 return s_ != 0 && i_ != s_->nelements();
589 template <
typename T>
592 set_fwd_iter<T>::invalidate()
595 i_ = s_->nelements();
596 mln_postcondition(! is_valid());
599 template <
typename T>
602 set_fwd_iter<T>::element()
const
604 mln_precondition(is_valid());
605 return s_->operator[](i_);
608 template <
typename T>
611 set_fwd_iter<T>::subj_()
613 mln_precondition(is_valid());
614 return s_->operator[](i_);
617 template <
typename T>
620 set_fwd_iter<T>::index_()
const
630 template <
typename T>
632 set_bkd_iter<T>::set_bkd_iter()
637 template <
typename T>
639 set_bkd_iter<T>::set_bkd_iter(
const set<T>& s)
644 template <
typename T>
647 set_bkd_iter<T>::change_target(
const set<T>& s)
653 template <
typename T>
656 set_bkd_iter<T>::start()
658 mln_precondition(s_ != 0);
659 if (! s_->is_empty())
660 i_ = s_->nelements() - 1;
663 template <
typename T>
666 set_bkd_iter<T>::next()
668 mln_precondition(is_valid());
675 template <
typename T>
678 set_bkd_iter<T>::is_valid()
const
680 return s_ != 0 && i_ != s_->nelements();
683 template <
typename T>
686 set_bkd_iter<T>::invalidate()
689 i_ = s_->nelements();
690 mln_postcondition(! is_valid());
693 template <
typename T>
696 set_bkd_iter<T>::element()
const
698 mln_precondition(is_valid());
699 return s_->operator[](i_);
702 template <
typename T>
705 set_bkd_iter<T>::subj_()
707 mln_precondition(is_valid());
708 return s_->operator[](i_);
711 template <
typename T>
714 set_bkd_iter<T>::index_()
const
723 template <
typename T>
724 std::ostream& operator<<(std::ostream& ostr,
729 for (
unsigned i = 0; i < n; ++i)
739 template <
typename T>
740 bool operator == (
const set<T>& lhs,
const set<T>& rhs)
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