14template<
typename Self,
typename Value,
typename Node,
typename Iterator,
typename ConstIterator,
15 template<
typename>
typename ValidForLookup,
bool is_multi>
19 constexpr static bool valid = ValidForLookup<T>::value;
21 constexpr auto self() -> Self& {
return static_cast<Self&
>(*this); }
22 constexpr auto self()
const -> Self
const& {
return static_cast<Self const&
>(*this); }
24 constexpr auto unconst_iterator(ConstIterator it) -> Iterator {
return self().unconst_iterator(util::move(it)); }
26 constexpr auto begin() -> Iterator {
return self().begin(); }
27 constexpr auto end() -> Iterator {
return self().end(); }
29 constexpr auto begin()
const -> ConstIterator {
return self().begin(); }
30 constexpr auto end()
const -> ConstIterator {
return self().end(); }
32 constexpr auto size()
const ->
usize
33 requires(
requires { self().size(); })
39 constexpr auto empty() const ->
bool {
return self().empty(); }
43 constexpr auto insert(Node& node) {
return self().insert_node(node); }
45 constexpr auto insert(ConstIterator hint, Node& node) {
return self().insert_node(hint, node); }
47 constexpr auto merge(Self& self) {
return self().merge_impl(util::move(self)); }
48 constexpr auto merge(Self&& self) {
return self().merge_impl(util::move(self)); }
50 constexpr auto erase(Iterator position) {
return self().erase_impl(util::move(position)); }
52 constexpr auto erase(Iterator first, Iterator last) -> Iterator {
53 while (first != last) {
54 self().erase_impl(first++);
60 if constexpr (!is_multi) {
61 auto it = this->
find(needle);
65 self().erase_impl(util::move(it));
70 for (; first != last; ++result) {
71 self().erase_impl(++first);
80 if constexpr (!is_multi) {
81 auto it = this->
find(needle);
85 self().erase_impl(util::move(it));
90 for (; first != last; ++result) {
91 self().erase_impl(++first);
120 auto it = this->
find(needle);
126 auto it = this->
find(needle);
135 auto it = this->
find(needle);
143 auto it = this->
find(needle);
149 constexpr auto find(Value
const& needle) -> Iterator {
return unconst_iterator(self().find_impl(needle)); }
150 constexpr auto find(Value
const& needle)
const -> ConstIterator {
return self().find_impl(needle); }
154 constexpr auto find(U&& needle) -> Iterator {
155 return unconst_iterator(self().find_impl(needle));
159 constexpr auto find(U&& needle)
const -> ConstIterator {
160 return self().find_impl(needle);
163 constexpr auto contains(Value
const& needle)
const ->
bool {
return this->
find(needle) != end(); }
166 constexpr auto contains(U&& needle)
const ->
bool {
167 return this->
find(needle) != end();
177 if constexpr (!is_multi) {
178 return this->
contains(needle) ? 1 : 0;
185 if constexpr (!is_multi) {
186 auto it = this->
find(needle);
189 auto [start, last] = self().equal_range_impl(needle);
190 return { unconst_iterator(util::move(start)), unconst_iterator(util::move(last)) };
196 if constexpr (!is_multi) {
197 auto it = this->
find(needle);
200 return self().equal_range_impl(needle);
205 if constexpr (!is_multi) {
206 auto it = this->
find(needle);
209 return self().equal_range_impl(needle);
215 if constexpr (!is_multi) {
216 auto it = this->
find(needle);
219 return self().equal_range_impl(needle);
228 return unconst_iterator(self().lower_bound_impl(needle));
230 constexpr auto lower_bound(Value
const& needle)
const -> ConstIterator
235 return self().lower_bound_impl(needle);
245 return unconst_iterator(self().lower_bound_impl(needle));
254 return self().lower_bound_impl(needle);
262 return unconst_iterator(self().upper_bound_impl(needle));
264 constexpr auto upper_bound(Value
const& needle)
const -> ConstIterator
269 return self().upper_bound_impl(needle);
279 return unconst_iterator(self().upper_bound_impl(needle));
288 return self().upper_bound_impl(needle);
298 if (!b.contains(*save)) {
311 if (b.contains(*save)) {
321 return a.merge(util::move(b));
324 return util::move(a);
329 constexpr friend auto operator|=(Self& a, Self&& b) ->
decltype(
auto) {
331 return a.merge(util::move(b));
340 constexpr friend auto operator&(Self&& a, Self
const& b)
344 return util::move(a);
347 constexpr friend auto operator&=(Self& a, Self
const& b) -> Self&
requires(!is_multi) {
353 constexpr friend auto operator-(Self&& a, Self
const& b)
357 return util::move(a);
360 constexpr friend auto operator-=(Self& a, Self
const& b) -> Self&
requires(!is_multi) {
365 template<
typename F, SameAs<Tag<erase_if>> T = Tag<erase_if>>
368 auto it = self.begin();
370 while (it != self.end()) {
Definition intrusive_set_interface.h:16
constexpr auto upper_bound(U &&needle) -> Iterator requires(
Definition intrusive_set_interface.h:274
constexpr void clear()
Definition intrusive_set_interface.h:41
constexpr auto lower_bound(U &&needle) const -> ConstIterator requires(
Definition intrusive_set_interface.h:249
constexpr auto front() const -> Optional< Value const & >
Definition intrusive_set_interface.h:102
constexpr auto find(U &&needle) -> Iterator
Definition intrusive_set_interface.h:154
constexpr friend auto operator-=(Self &a, Self const &b) -> Self &requires(!is_multi)
Definition intrusive_set_interface.h:360
constexpr friend auto operator-(Self &&a, Self const &b)
Set differerce.
Definition intrusive_set_interface.h:353
constexpr auto count(Value const &needle) const -> usize
Definition intrusive_set_interface.h:170
constexpr auto lower_bound(Value const &needle) -> Iterator requires(
Definition intrusive_set_interface.h:223
constexpr auto lower_bound(U &&needle) -> Iterator requires(
Definition intrusive_set_interface.h:240
constexpr auto count(U &&needle) const -> usize
Definition intrusive_set_interface.h:176
constexpr friend auto operator&(Self &&a, Self const &b)
Set intersection.
Definition intrusive_set_interface.h:340
constexpr auto merge(Self &&self)
Definition intrusive_set_interface.h:48
constexpr auto erase(Iterator position)
Definition intrusive_set_interface.h:50
constexpr auto insert(ConstIterator hint, Node &node)
Definition intrusive_set_interface.h:45
constexpr auto insert(Node &node)
Definition intrusive_set_interface.h:43
constexpr auto equal_range(Value const &needle) -> View< Iterator >
Definition intrusive_set_interface.h:184
constexpr auto erase(Value const &needle) -> usize
Definition intrusive_set_interface.h:59
constexpr friend auto operator&=(Self &a, Self const &b) -> Self &requires(!is_multi)
Definition intrusive_set_interface.h:347
constexpr auto erase(U &&needle) -> usize
Definition intrusive_set_interface.h:79
constexpr auto equal_range(U &&needle) const -> View< ConstIterator >
Definition intrusive_set_interface.h:214
constexpr void subtract(Self const &b)
Definition intrusive_set_interface.h:304
constexpr auto erase(Iterator first, Iterator last) -> Iterator
Definition intrusive_set_interface.h:52
constexpr auto equal_range(U &&needle) -> View< Iterator >
Definition intrusive_set_interface.h:195
constexpr auto front() -> Optional< Value & >
Definition intrusive_set_interface.h:97
constexpr auto empty() const -> bool
Definition intrusive_set_interface.h:39
constexpr auto merge(Self &self)
Definition intrusive_set_interface.h:47
constexpr auto contains(U &&needle) const -> bool
Definition intrusive_set_interface.h:166
constexpr friend auto tag_invoke(T, Self &self, F &&function) -> usize
Definition intrusive_set_interface.h:367
constexpr auto lower_bound(Value const &needle) const -> ConstIterator requires(
Definition intrusive_set_interface.h:230
constexpr auto back() const -> Optional< Value const & >
Definition intrusive_set_interface.h:113
constexpr auto at(Value const &needle) -> Optional< Value & >
Definition intrusive_set_interface.h:119
constexpr auto upper_bound(Value const &needle) -> Iterator requires(
Definition intrusive_set_interface.h:257
constexpr auto at(U &&needle) -> Optional< Value & >
Definition intrusive_set_interface.h:134
constexpr auto upper_bound(Value const &needle) const -> ConstIterator requires(
Definition intrusive_set_interface.h:264
constexpr auto at(U &&needle) const -> Optional< Value const & >
Definition intrusive_set_interface.h:142
constexpr auto find(U &&needle) const -> ConstIterator
Definition intrusive_set_interface.h:159
constexpr auto upper_bound(U &&needle) const -> ConstIterator requires(
Definition intrusive_set_interface.h:283
constexpr auto find(Value const &needle) -> Iterator
Definition intrusive_set_interface.h:149
constexpr auto back() -> Optional< Value & >
Definition intrusive_set_interface.h:108
constexpr friend auto operator|(Self &&a, Self &&b)
Set union.
Definition intrusive_set_interface.h:319
constexpr void intersect(Self const &b)
Definition intrusive_set_interface.h:291
constexpr auto at(Value const &needle) const -> Optional< Value const & >
Definition intrusive_set_interface.h:125
constexpr auto find(Value const &needle) const -> ConstIterator
Definition intrusive_set_interface.h:150
constexpr auto contains(Value const &needle) const -> bool
Definition intrusive_set_interface.h:163
constexpr auto equal_range(Value const &needle) const -> View< ConstIterator >
Definition intrusive_set_interface.h:204
constexpr friend auto operator|=(Self &a, Self &&b) -> decltype(auto)
Definition intrusive_set_interface.h:329
Definition optional_forward_declaration.h:5
constexpr auto prev
Definition prev.h:28
constexpr auto next
Definition next.h:35
constexpr auto find
Definition find.h:35
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 contains
Definition contains.h:24
constexpr auto to_unsigned
Definition to_unsigned.h:16
size_t usize
Definition integers.h:33
constexpr auto ref
Definition reference_wrapper.h:98
constexpr auto cref
Definition reference_wrapper.h:99
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