Iros
 
Loading...
Searching...
No Matches
intrusive_set_interface.h
Go to the documentation of this file.
1#pragma once
2
12
13namespace di::container {
14template<typename Self, typename Value, typename Node, typename Iterator, typename ConstIterator,
15 template<typename> typename ValidForLookup, bool is_multi>
17private:
18 template<typename T>
19 constexpr static bool valid = ValidForLookup<T>::value;
20
21 constexpr auto self() -> Self& { return static_cast<Self&>(*this); }
22 constexpr auto self() const -> Self const& { return static_cast<Self const&>(*this); }
23
24 constexpr auto unconst_iterator(ConstIterator it) -> Iterator { return self().unconst_iterator(util::move(it)); }
25
26 constexpr auto begin() -> Iterator { return self().begin(); }
27 constexpr auto end() -> Iterator { return self().end(); }
28
29 constexpr auto begin() const -> ConstIterator { return self().begin(); }
30 constexpr auto end() const -> ConstIterator { return self().end(); }
31
32 constexpr auto size() const -> usize
33 requires(requires { self().size(); })
34 {
35 return self().size();
36 }
37
38public:
39 constexpr auto empty() const -> bool { return self().empty(); }
40
41 constexpr void clear() { erase(begin(), end()); }
42
43 constexpr auto insert(Node& node) { return self().insert_node(node); }
44
45 constexpr auto insert(ConstIterator hint, Node& node) { return self().insert_node(hint, node); }
46
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)); }
49
50 constexpr auto erase(Iterator position) { return self().erase_impl(util::move(position)); }
51
52 constexpr auto erase(Iterator first, Iterator last) -> Iterator {
53 while (first != last) {
54 self().erase_impl(first++);
55 }
56 return last;
57 }
58
59 constexpr auto erase(Value const& needle) -> usize {
60 if constexpr (!is_multi) {
61 auto it = this->find(needle);
62 if (it == end()) {
63 return 0;
64 }
65 self().erase_impl(util::move(it));
66 return 1;
67 } else {
68 auto [first, last] = this->equal_range(needle);
69 usize result = 0;
70 for (; first != last; ++result) {
71 self().erase_impl(++first);
72 }
73 return result;
74 }
75 }
76
77 template<typename U>
78 requires(valid<U>)
79 constexpr auto erase(U&& needle) -> usize {
80 if constexpr (!is_multi) {
81 auto it = this->find(needle);
82 if (it == end()) {
83 return 0;
84 }
85 self().erase_impl(util::move(it));
86 return 1;
87 } else {
88 auto [first, last] = this->equal_range(needle);
89 usize result = 0;
90 for (; first != last; ++result) {
91 self().erase_impl(++first);
92 }
93 return result;
94 }
95 }
96
97 constexpr auto front() -> Optional<Value&> {
98 return lift_bool(!empty()) % [&] {
99 return util::ref(*begin());
100 };
101 }
102 constexpr auto front() const -> Optional<Value const&> {
103 return lift_bool(!empty()) % [&] {
104 return util::cref(*begin());
105 };
106 }
107
108 constexpr auto back() -> Optional<Value&> {
109 return lift_bool(!empty()) % [&] {
110 return util::ref(*container::prev(end()));
111 };
112 }
113 constexpr auto back() const -> Optional<Value const&> {
114 return lift_bool(!empty()) % [&] {
115 return util::cref(*container::prev(end()));
116 };
117 }
118
119 constexpr auto at(Value const& needle) -> Optional<Value&> {
120 auto it = this->find(needle);
121 return lift_bool(it != end()) % [&] {
122 return util::ref(*it);
123 };
124 }
125 constexpr auto at(Value const& needle) const -> Optional<Value const&> {
126 auto it = this->find(needle);
127 return lift_bool(it != end()) % [&] {
128 return util::cref(*it);
129 };
130 }
131
132 template<typename U>
133 requires(valid<U>)
134 constexpr auto at(U&& needle) -> Optional<Value&> {
135 auto it = this->find(needle);
136 return lift_bool(it != end()) % [&] {
137 return util::ref(*it);
138 };
139 }
140 template<typename U>
141 requires(valid<U>)
142 constexpr auto at(U&& needle) const -> Optional<Value const&> {
143 auto it = this->find(needle);
144 return lift_bool(it != end()) % [&] {
145 return util::cref(*it);
146 };
147 }
148
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); }
151
152 template<typename U>
153 requires(valid<U>)
154 constexpr auto find(U&& needle) -> Iterator {
155 return unconst_iterator(self().find_impl(needle));
156 }
157 template<typename U>
158 requires(valid<U>)
159 constexpr auto find(U&& needle) const -> ConstIterator {
160 return self().find_impl(needle);
161 }
162
163 constexpr auto contains(Value const& needle) const -> bool { return this->find(needle) != end(); }
164 template<typename U>
165 requires(valid<U>)
166 constexpr auto contains(U&& needle) const -> bool {
167 return this->find(needle) != end();
168 }
169
170 constexpr auto count(Value const& needle) const -> usize {
172 }
173
174 template<typename U>
175 requires(valid<U>)
176 constexpr auto count(U&& needle) const -> usize {
177 if constexpr (!is_multi) {
178 return this->contains(needle) ? 1 : 0;
179 } else {
181 }
182 }
183
184 constexpr auto equal_range(Value const& needle) -> View<Iterator> {
185 if constexpr (!is_multi) {
186 auto it = this->find(needle);
187 return { it, container::next(it, 1, end()) };
188 } else {
189 auto [start, last] = self().equal_range_impl(needle);
190 return { unconst_iterator(util::move(start)), unconst_iterator(util::move(last)) };
191 }
192 }
193 template<typename U>
194 requires(valid<U>)
195 constexpr auto equal_range(U&& needle) -> View<Iterator> {
196 if constexpr (!is_multi) {
197 auto it = this->find(needle);
198 return { it, container::next(it, 1, end()) };
199 } else {
200 return self().equal_range_impl(needle);
201 }
202 }
203
204 constexpr auto equal_range(Value const& needle) const -> View<ConstIterator> {
205 if constexpr (!is_multi) {
206 auto it = this->find(needle);
207 return { it, container::next(it, 1, end()) };
208 } else {
209 return self().equal_range_impl(needle);
210 }
211 }
212 template<typename U>
213 requires(valid<U>)
214 constexpr auto equal_range(U&& needle) const -> View<ConstIterator> {
215 if constexpr (!is_multi) {
216 auto it = this->find(needle);
217 return { it, container::next(it, 1, end()) };
218 } else {
219 return self().equal_range_impl(needle);
220 }
221 }
222
223 constexpr auto lower_bound(Value const& needle) -> Iterator
224 requires(requires {
225 { self().lower_bound_impl(needle) } -> concepts::SameAs<ConstIterator>;
226 })
227 {
228 return unconst_iterator(self().lower_bound_impl(needle));
229 }
230 constexpr auto lower_bound(Value const& needle) const -> ConstIterator
231 requires(requires {
232 { self().lower_bound_impl(needle) } -> concepts::SameAs<ConstIterator>;
233 })
234 {
235 return self().lower_bound_impl(needle);
236 }
237
238 template<typename U>
239 requires(valid<U>)
240 constexpr auto lower_bound(U&& needle) -> Iterator
241 requires(requires {
242 { self().lower_bound_impl(needle) } -> concepts::SameAs<ConstIterator>;
243 })
244 {
245 return unconst_iterator(self().lower_bound_impl(needle));
246 }
247 template<typename U>
248 requires(valid<U>)
249 constexpr auto lower_bound(U&& needle) const -> ConstIterator
250 requires(requires {
251 { self().lower_bound_impl(needle) } -> concepts::SameAs<ConstIterator>;
252 })
253 {
254 return self().lower_bound_impl(needle);
255 }
256
257 constexpr auto upper_bound(Value const& needle) -> Iterator
258 requires(requires {
259 { self().upper_bound_impl(needle) } -> concepts::SameAs<ConstIterator>;
260 })
261 {
262 return unconst_iterator(self().upper_bound_impl(needle));
263 }
264 constexpr auto upper_bound(Value const& needle) const -> ConstIterator
265 requires(requires {
266 { self().upper_bound_impl(needle) } -> concepts::SameAs<ConstIterator>;
267 })
268 {
269 return self().upper_bound_impl(needle);
270 }
271
272 template<typename U>
273 requires(valid<U>)
274 constexpr auto upper_bound(U&& needle) -> Iterator
275 requires(requires {
276 { self().upper_bound_impl(needle) } -> concepts::SameAs<ConstIterator>;
277 })
278 {
279 return unconst_iterator(self().upper_bound_impl(needle));
280 }
281 template<typename U>
282 requires(valid<U>)
283 constexpr auto upper_bound(U&& needle) const -> ConstIterator
284 requires(requires {
285 { self().upper_bound_impl(needle) } -> concepts::SameAs<ConstIterator>;
286 })
287 {
288 return self().upper_bound_impl(needle);
289 }
290
291 constexpr void intersect(Self const& b)
292 requires(!is_multi)
293 {
294 auto it = begin();
295 auto last = end();
296 while (it != last) {
297 auto save = it++;
298 if (!b.contains(*save)) {
299 erase(save);
300 }
301 }
302 }
303
304 constexpr void subtract(Self const& b)
305 requires(!is_multi)
306 {
307 auto it = begin();
308 auto last = end();
309 while (it != last) {
310 auto save = it++;
311 if (b.contains(*save)) {
312 erase(save);
313 }
314 }
315 }
316
317private:
319 constexpr friend auto operator|(Self&& a, Self&& b) {
320 return invoke_as_fallible([&] {
321 return a.merge(util::move(b));
322 }) |
323 [&] {
324 return util::move(a);
325 } |
327 }
328
329 constexpr friend auto operator|=(Self& a, Self&& b) -> decltype(auto) {
330 return invoke_as_fallible([&] {
331 return a.merge(util::move(b));
332 }) |
333 [&] {
334 return util::ref(a);
335 } |
337 }
338
340 constexpr friend auto operator&(Self&& a, Self const& b)
341 requires(!is_multi)
342 {
343 a.intersect(b);
344 return util::move(a);
345 }
346
347 constexpr friend auto operator&=(Self& a, Self const& b) -> Self& requires(!is_multi) {
348 a.intersect(b);
349 return a;
350 }
351
353 constexpr friend auto operator-(Self&& a, Self const& b)
354 requires(!is_multi)
355 {
356 a.subtract(b);
357 return util::move(a);
358 }
359
360 constexpr friend auto operator-=(Self& a, Self const& b) -> Self& requires(!is_multi) {
361 a.subtract(b);
362 return a;
363 }
364
365 template<typename F, SameAs<Tag<erase_if>> T = Tag<erase_if>>
367 constexpr friend auto tag_invoke(T, Self& self, F&& function) -> usize {
368 auto it = self.begin();
369 auto result = 0ZU;
370 while (it != self.end()) {
371 if (function(*it)) {
372 it = self.erase(it);
373 ++result;
374 } else {
375 ++it;
376 }
377 }
378 return result;
379 }
380};
381}
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 view.h:35
Definition optional_forward_declaration.h:5
Definition relation.h:7
Definition core.h:114
Definition sequence.h:12
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
Definition as_bool.h:8
constexpr auto to_unsigned
Definition to_unsigned.h:16
Conditional< concepts::ConstantIterator< Iter >, Iter, container::ConstIteratorImpl< Iter > > ConstIterator
Definition const_iterator.h:8
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