17         template<
typename> 
typename ValidForLookup, 
bool is_multi>
 
   21    constexpr static bool valid = ValidForLookup<T>::value;
 
   23    constexpr auto self() -> Self& { 
return static_cast<Self&
>(*this); }
 
   24    constexpr auto self() 
const -> Self 
const& { 
return static_cast<Self const&
>(*this); }
 
   26    constexpr auto unconst_iterator(ConstIterator it) -> Iterator { 
return self().unconst_iterator(util::move(it)); }
 
   28    constexpr auto begin() -> Iterator { 
return self().begin(); }
 
   29    constexpr auto end() -> Iterator { 
return self().end(); }
 
   31    constexpr auto begin() 
const -> ConstIterator { 
return self().begin(); }
 
   32    constexpr auto end() 
const -> ConstIterator { 
return self().end(); }
 
   34    constexpr auto size() 
const -> 
size_t { 
return self().size(); }
 
   36    template<concepts::ContainerCompatible<Value> Con, 
typename... Args>
 
   40        auto result = Self(util::forward<Args>(args)...);
 
   41        result.insert_container(util::forward<Con>(
container));
 
 
   46    constexpr auto empty() const -> 
bool { 
return size() == 0; }
 
   48    constexpr void clear() { 
erase(this->begin(), this->end()); }
 
   50    constexpr auto insert(Value 
const& value)
 
   53        return self().insert_with_factory(value, [&] {
 
 
   58    constexpr auto insert(Value&& value) {
 
   59        return self().insert_with_factory(value, [&] {
 
   60            return util::move(value);
 
 
   67        return self().insert_with_factory(value, [&] {
 
 
   72    constexpr auto insert(ConstIterator hint, Value 
const& value)
 
   75        return self().insert_with_factory(hint, value, [&] {
 
 
   80    constexpr auto insert(ConstIterator hint, Value&& value) {
 
   81        return self().insert_with_factory(hint, value, [&] {
 
   82            return util::move(value);
 
 
   88    constexpr auto insert(ConstIterator hint, U&& value) {
 
   89        return self().insert_with_factory(hint, value, [&] {
 
 
   94    template<
typename... Args>
 
   97        return insert(Value(util::forward<Args>(args)...));
 
 
  100    template<
typename... Args>
 
  103        return insert(util::move(hint), Value(util::forward<Args>(args)...));
 
 
  106    template<concepts::ContainerCompatible<Value> Con>
 
  109            auto temp_container = Self {};
 
  111                                       [&]<
typename X>(X&& value) {
 
  112                                           return temp_container.insert(util::forward<X>(value));
 
  116                           return self().merge_impl(util::move(temp_container));
 
  122            for (; first != last; ++first) {
 
 
  128    template<concepts::ContainerCompatible<Value> Con>
 
  135            for (; first != last; ++first) {
 
  136                hint = 
insert(hint, *first);
 
 
  141    constexpr auto merge(Self& self) { 
return self().merge_impl(util::move(self)); }
 
  142    constexpr auto merge(Self&& self) { 
return self().merge_impl(util::move(self)); }
 
  144    constexpr auto erase(Iterator position) { 
return self().erase_impl(util::move(position)); }
 
  146    constexpr auto erase(Iterator first, Iterator last) -> Iterator {
 
  147        while (first != last) {
 
  148            first = self().erase_impl(first);
 
 
  153    constexpr auto erase(Value 
const& needle) -> 
size_t {
 
  154        if constexpr (!is_multi) {
 
  155            auto it = this->
find(needle);
 
  159            self().erase_impl(util::move(it));
 
  164            for (; first != last; ++result) {
 
  165                first = self().erase_impl(first);
 
 
  173    constexpr auto erase(U&& needle) -> 
size_t {
 
  174        if constexpr (!is_multi) {
 
  175            auto it = this->
find(needle);
 
  179            self().erase_impl(util::move(it));
 
  184            for (; first != last; ++result) {
 
  185                first = self().erase_impl(first);
 
 
  214        auto it = this->
find(needle);
 
 
  220        auto it = this->
find(needle);
 
 
  229        auto it = this->
find(needle);
 
 
  237        auto it = this->
find(needle);
 
 
  243    constexpr auto find(Value 
const& needle) -> Iterator { 
return unconst_iterator(self().find_impl(needle)); }
 
  244    constexpr auto find(Value 
const& needle) 
const -> ConstIterator { 
return self().find_impl(needle); }
 
  248    constexpr auto find(U&& needle) -> Iterator {
 
  249        return unconst_iterator(self().find_impl(needle));
 
 
  253    constexpr auto find(U&& needle) 
const -> ConstIterator {
 
  254        return self().find_impl(needle);
 
 
  257    constexpr auto contains(Value 
const& needle) 
const -> 
bool { 
return this->
find(needle) != end(); }
 
  260    constexpr auto contains(U&& needle) 
const -> 
bool {
 
  261        return this->
find(needle) != end();
 
 
  264    constexpr auto count(Value 
const& needle) 
const -> 
size_t {
 
  265        if constexpr (!is_multi) {
 
  266            return this->
contains(needle) ? 1 : 0;
 
 
  274    constexpr auto count(U&& needle) 
const -> 
size_t {
 
  275        if constexpr (!is_multi) {
 
  276            return this->
contains(needle) ? 1 : 0;
 
 
  283        if constexpr (!is_multi) {
 
  284            auto it = this->
find(needle);
 
  287            auto [start, last] = self().equal_range_impl(needle);
 
  288            return { unconst_iterator(util::move(start)), unconst_iterator(util::move(last)) };
 
 
  294        if constexpr (!is_multi) {
 
  295            auto it = this->
find(needle);
 
  298            return self().equal_range_impl(needle);
 
 
  303        if constexpr (!is_multi) {
 
  304            auto it = this->
find(needle);
 
  307            return self().equal_range_impl(needle);
 
 
  313        if constexpr (!is_multi) {
 
  314            auto it = this->
find(needle);
 
  317            return self().equal_range_impl(needle);
 
 
  326        return unconst_iterator(self().lower_bound_impl(needle));
 
  328    constexpr auto lower_bound(Value 
const& needle) 
const -> ConstIterator
 
 
  333        return self().lower_bound_impl(needle);
 
  343        return unconst_iterator(self().lower_bound_impl(needle));
 
  352        return self().lower_bound_impl(needle);
 
  360        return unconst_iterator(self().upper_bound_impl(needle));
 
  362    constexpr auto upper_bound(Value 
const& needle) 
const -> ConstIterator
 
 
  367        return self().upper_bound_impl(needle);
 
  377        return unconst_iterator(self().upper_bound_impl(needle));
 
  386        return self().upper_bound_impl(needle);
 
  396            if (!b.contains(*save)) {
 
 
  409            if (b.contains(*save)) {
 
 
  419                   return a.merge(util::move(b));
 
  422                   return util::move(a);
 
 
  427    constexpr friend auto operator|=(Self& a, Self&& b) -> 
decltype(
auto) {
 
  429                   return a.merge(util::move(b));
 
 
  438    constexpr friend auto operator&(Self&& a, Self 
const& b)
 
  442        return util::move(a);
 
 
  445    constexpr friend auto operator&=(Self& a, Self 
const& b) -> Self& 
requires(!is_multi) {
 
 
  451    constexpr friend auto operator-(Self&& a, Self 
const& b)
 
  455        return util::move(a);
 
 
  458    constexpr friend auto operator-=(Self& a, Self 
const& b) -> Self& 
requires(!is_multi) {
 
 
  463    template<
typename F, SameAs<Tag<erase_if>> T = Tag<erase_if>>
 
  466        auto it = self.begin();
 
  468        while (it != self.end()) {
 
 
 
Definition set_interface.h:18
 
constexpr auto merge(Self &self)
Definition set_interface.h:141
 
constexpr auto back() const -> Optional< Value const & >
Definition set_interface.h:207
 
constexpr auto at(U &&needle) const -> Optional< Value const & >
Definition set_interface.h:236
 
constexpr auto insert(Value const &value)
Definition set_interface.h:50
 
constexpr auto insert(ConstIterator hint, Value &&value)
Definition set_interface.h:80
 
constexpr auto merge(Self &&self)
Definition set_interface.h:142
 
constexpr auto lower_bound(Value const &needle) -> Iterator requires(
Definition set_interface.h:321
 
constexpr auto at(Value const &needle) const -> Optional< Value const & >
Definition set_interface.h:219
 
constexpr friend auto operator-=(Self &a, Self const &b) -> Self &requires(!is_multi)
Definition set_interface.h:458
 
constexpr friend auto operator-(Self &&a, Self const &b)
Definition set_interface.h:451
 
constexpr auto lower_bound(U &&needle) -> Iterator requires(
Definition set_interface.h:338
 
constexpr auto upper_bound(Value const &needle) const -> ConstIterator requires(
Definition set_interface.h:362
 
constexpr auto back() -> Optional< Value & >
Definition set_interface.h:202
 
constexpr friend auto operator&(Self &&a, Self const &b)
Definition set_interface.h:438
 
constexpr auto insert(U &&value)
Definition set_interface.h:66
 
constexpr auto equal_range(U &&needle) const -> View< ConstIterator >
Definition set_interface.h:312
 
constexpr auto find(U &&needle) -> Iterator
Definition set_interface.h:248
 
constexpr auto erase(U &&needle) -> size_t
Definition set_interface.h:173
 
constexpr auto find(U &&needle) const -> ConstIterator
Definition set_interface.h:253
 
constexpr auto erase(Iterator first, Iterator last) -> Iterator
Definition set_interface.h:146
 
constexpr friend auto operator&=(Self &a, Self const &b) -> Self &requires(!is_multi)
Definition set_interface.h:445
 
constexpr auto insert(ConstIterator hint, Value const &value)
Definition set_interface.h:72
 
constexpr auto emplace_hint(ConstIterator hint, Args &&... args)
Definition set_interface.h:102
 
constexpr auto find(Value const &needle) const -> ConstIterator
Definition set_interface.h:244
 
constexpr void subtract(Self const &b)
Definition set_interface.h:402
 
constexpr void intersect(Self const &b)
Definition set_interface.h:389
 
constexpr auto emplace(Args &&... args)
Definition set_interface.h:96
 
constexpr auto at(Value const &needle) -> Optional< Value & >
Definition set_interface.h:213
 
constexpr auto erase(Iterator position)
Definition set_interface.h:144
 
constexpr auto upper_bound(U &&needle) -> Iterator requires(
Definition set_interface.h:372
 
constexpr auto at(U &&needle) -> Optional< Value & >
Definition set_interface.h:228
 
constexpr auto front() -> Optional< Value & >
Definition set_interface.h:191
 
constexpr void insert_container(ConstIterator hint, Con &&container)
Definition set_interface.h:129
 
constexpr auto count(U &&needle) const -> size_t
Definition set_interface.h:274
 
constexpr auto front() const -> Optional< Value const & >
Definition set_interface.h:196
 
constexpr auto insert(Value &&value)
Definition set_interface.h:58
 
constexpr auto count(Value const &needle) const -> size_t
Definition set_interface.h:264
 
constexpr auto equal_range(U &&needle) -> View< Iterator >
Definition set_interface.h:293
 
constexpr friend auto tag_invoke(types::Tag< util::create_in_place >, InPlaceType< Self >, Con &&container, Args &&... args)
Definition set_interface.h:38
 
constexpr auto erase(Value const &needle) -> size_t
Definition set_interface.h:153
 
constexpr friend auto tag_invoke(T, Self &self, F &&function) -> usize
Definition set_interface.h:465
 
constexpr auto find(Value const &needle) -> Iterator
Definition set_interface.h:243
 
constexpr auto upper_bound(Value const &needle) -> Iterator requires(
Definition set_interface.h:355
 
constexpr auto upper_bound(U &&needle) const -> ConstIterator requires(
Definition set_interface.h:381
 
constexpr auto lower_bound(U &&needle) const -> ConstIterator requires(
Definition set_interface.h:347
 
constexpr auto lower_bound(Value const &needle) const -> ConstIterator requires(
Definition set_interface.h:328
 
constexpr void clear()
Definition set_interface.h:48
 
constexpr auto insert(ConstIterator hint, U &&value)
Definition set_interface.h:88
 
constexpr auto equal_range(Value const &needle) -> View< Iterator >
Definition set_interface.h:282
 
constexpr auto empty() const -> bool
Definition set_interface.h:46
 
constexpr friend auto operator|(Self &&a, Self &&b)
Definition set_interface.h:417
 
constexpr auto equal_range(Value const &needle) const -> View< ConstIterator >
Definition set_interface.h:302
 
constexpr auto contains(Value const &needle) const -> bool
Definition set_interface.h:257
 
constexpr auto insert_container(Con &&container)
Definition set_interface.h:107
 
constexpr friend auto operator|=(Self &a, Self &&b) -> decltype(auto)
Definition set_interface.h:427
 
constexpr auto contains(U &&needle) const -> bool
Definition set_interface.h:260
 
Definition optional_forward_declaration.h:5
 
Definition operations.h:11
 
constexpr auto prev
Definition prev.h:28
 
constexpr auto next
Definition next.h:35
 
constexpr auto find
Definition find.h:35
 
constexpr auto sequence
Definition sequence.h:34
 
constexpr auto distance
Definition distance.h:44
 
constexpr auto erase
Definition erase.h:76
 
constexpr auto equal_range
Definition equal_range.h:39
 
constexpr auto end
Definition end.h:47
 
constexpr auto begin
Definition begin.h:44
 
constexpr auto contains
Definition contains.h:24
 
constexpr auto to_unsigned
Definition to_unsigned.h:16
 
size_t usize
Definition integers.h:33
 
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
 
constexpr auto ref
Definition reference_wrapper.h:98
 
constexpr auto cref
Definition reference_wrapper.h:99
 
constexpr auto clone
Definition clone.h:39
 
constexpr auto create(Args &&... args)
Definition create.h:21
 
constexpr auto invoke_as_fallible
Definition invoke_as_fallible.h:37
 
constexpr auto try_infallible
Definition try_infallible.h:31
 
constexpr auto lift_bool
Definition lift_bool.h:13
 
@ Self
Definition local_apic.h:126
 
Definition in_place_type.h:5