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