19template<
typename Self,
typename Value,
typename Key,
typename Val,
typename Iterator,
typename ConstIterator,
20 template<
typename>
typename ValidForLookup,
bool is_multi>
24 constexpr static bool valid = ValidForLookup<T>::value;
26 constexpr auto self() -> Self& {
return static_cast<Self&
>(*this); }
27 constexpr auto self()
const -> Self
const& {
return static_cast<Self const&
>(*this); }
29 constexpr auto unconst_iterator(ConstIterator it) -> Iterator {
return self().unconst_iterator(util::move(it)); }
31 constexpr auto begin() -> Iterator {
return self().begin(); }
32 constexpr auto end() -> Iterator {
return self().end(); }
34 constexpr auto begin()
const -> ConstIterator {
return self().begin(); }
35 constexpr auto end()
const -> ConstIterator {
return self().end(); }
37 constexpr auto size()
const ->
size_t {
return self().size(); }
39 template<concepts::ContainerCompatible<Value> Con,
typename... Args>
43 auto result = Self(util::forward<Args>(args)...);
44 result.insert_container(util::forward<Con>(
container));
49 constexpr auto empty() const ->
bool {
return size() == 0; }
53 constexpr auto operator[](Key
const& needle) ->
decltype(
auto)
61 constexpr auto operator[](Key&& needle) ->
decltype(
auto)
71 constexpr auto operator[](K&& needle) ->
decltype(
auto) {
77 constexpr auto insert(Value
const& value)
80 return self().insert_with_factory(value, [&] {
85 constexpr auto insert(Value&& value) {
86 return self().insert_with_factory(value, [&] {
87 return util::move(value);
94 return self().insert_with_factory(value, [&] {
99 constexpr auto insert(ConstIterator hint, Value
const& value)
102 return self().insert_with_factory(hint, value, [&] {
107 constexpr auto insert(ConstIterator hint, Value&& value) {
108 return self().insert_with_factory(hint, value, [&] {
109 return util::move(value);
115 constexpr auto insert(ConstIterator hint, U&& value) {
116 return self().insert_with_factory(hint, value, [&] {
124 bool did_insert =
false;
131 return Value(util::move(key), util::move(value));
146 bool did_insert =
false;
152 return Value(util::move(needle), util::move(value));
163 template<
typename K,
typename U>
166 bool did_insert =
false;
173 return Value(util::move(key), util::move(value));
188 bool did_insert =
false;
195 return Value(util::move(key), util::move(value));
210 bool did_insert =
false;
216 return Value(util::move(needle), util::move(value));
227 template<
typename K,
typename U>
230 bool did_insert =
false;
237 return Value(util::move(key), util::move(value));
249 template<
typename... Args>
252 return self().insert_with_factory(needle, [&] {
255 return Value(util::move(key), util::move(value));
261 template<
typename... Args>
264 return self().insert_with_factory(needle, [&] {
266 return Value(util::move(needle), util::move(value));
271 template<
typename K,
typename... Args>
274 return self().insert_with_factory(needle, [&] {
277 return Value(util::move(key), util::move(value));
283 template<
typename... Args>
285 constexpr auto try_emplace(ConstIterator hint, Key
const& needle, Args&&... args) {
286 return self().insert_with_factory(hint, needle, [&] {
289 return Value(util::move(key), util::move(value));
295 template<
typename... Args>
297 constexpr auto try_emplace(ConstIterator hint, Key&& needle, Args&&... args) {
298 return self().insert_with_factory(hint, needle, [&] {
300 return Value(util::move(needle), util::move(value));
305 template<
typename K,
typename... Args>
307 constexpr auto try_emplace(ConstIterator hint, K&& needle, Args&&... args) {
308 return self().insert_with_factory(hint, needle, [&] {
311 return Value(util::move(key), util::move(value));
317 template<
typename... Args>
320 return insert(Value(util::forward<Args>(args)...));
323 template<
typename... Args>
326 return insert(hint, Value(util::forward<Args>(args)...));
329 template<concepts::ContainerCompatible<Value> Con>
332 auto temp_container = Self {};
334 [&]<
typename X>(X&& value) {
335 return temp_container.insert(util::forward<X>(value));
339 return self().merge_impl(util::move(temp_container));
345 for (; first != last; ++first) {
351 template<concepts::ContainerCompatible<Value> Con>
358 for (; first != last; ++first) {
359 hint =
insert(hint, *first);
364 constexpr auto merge(Self& self) {
return self().merge_impl(util::move(self)); }
365 constexpr auto merge(Self&& self) {
return self().merge_impl(util::move(self)); }
367 constexpr auto erase(Iterator position) {
return self().erase_impl(util::move(position)); }
369 constexpr auto erase(Iterator first, Iterator last) -> Iterator {
370 while (first != last) {
371 first = self().erase_impl(first);
376 constexpr auto erase(Key
const& needle) ->
size_t {
377 if constexpr (!is_multi) {
378 auto it = this->
find(needle);
382 self().erase_impl(util::move(it));
387 for (; first != last; ++result) {
388 first = self().erase_impl(first);
396 constexpr auto erase(U&& needle) ->
size_t {
397 if constexpr (!is_multi) {
398 auto it = this->
find(needle);
402 self().erase_impl(util::move(it));
407 for (; first != last; ++result) {
408 first = self().erase_impl(first);
437 auto it = this->
find(needle);
443 auto it = this->
find(needle);
452 auto it = this->
find(needle);
460 auto it = this->
find(needle);
466 constexpr auto find(Key
const& needle) -> Iterator {
return unconst_iterator(self().find_impl(needle)); }
467 constexpr auto find(Key
const& needle)
const -> ConstIterator {
return self().find_impl(needle); }
471 constexpr auto find(U&& needle) -> Iterator {
472 return unconst_iterator(self().find_impl(needle));
476 constexpr auto find(U&& needle)
const -> ConstIterator {
477 return self().find_impl(needle);
480 constexpr auto contains(Key
const& needle)
const ->
bool {
return this->
find(needle) != end(); }
483 constexpr auto contains(U&& needle)
const ->
bool {
484 return this->
find(needle) != end();
487 constexpr auto count(Key
const& needle)
const ->
size_t {
488 if constexpr (!is_multi) {
489 return this->
contains(needle) ? 1 : 0;
497 constexpr auto count(U&& needle)
const ->
size_t {
498 if constexpr (!is_multi) {
499 return this->
contains(needle) ? 1 : 0;
506 if constexpr (!is_multi) {
507 auto it = this->
find(needle);
510 auto [start, last] = self().equal_range_impl(needle);
511 return View<Iterator> { unconst_iterator(util::move(start)), unconst_iterator(util::move(last)) };
517 if constexpr (!is_multi) {
518 auto it = this->
find(needle);
521 return self().equal_range_impl(needle);
526 if constexpr (!is_multi) {
527 auto it = this->
find(needle);
530 return self().equal_range_impl(needle);
536 if constexpr (!is_multi) {
537 auto it = this->
find(needle);
540 return self().equal_range_impl(needle);
549 return unconst_iterator(self().lower_bound_impl(needle));
551 constexpr auto lower_bound(Key
const& needle)
const -> ConstIterator
556 return self().lower_bound_impl(needle);
566 return unconst_iterator(self().lower_bound_impl(needle));
575 return self().lower_bound_impl(needle);
583 return unconst_iterator(self().upper_bound_impl(needle));
585 constexpr auto upper_bound(Key
const& needle)
const -> ConstIterator
590 return self().upper_bound_impl(needle);
600 return unconst_iterator(self().upper_bound_impl(needle));
609 return self().upper_bound_impl(needle);
613 template<
typename F, SameAs<Tag<erase_if>> T = Tag<erase_if>>
616 auto it = self.begin();
618 while (it != self.end()) {
Definition map_interface.h:21
constexpr auto count(Key const &needle) const -> size_t
Definition map_interface.h:487
constexpr auto upper_bound(U &&needle) const -> ConstIterator requires(
Definition map_interface.h:604
constexpr auto insert(Value const &value)
Definition map_interface.h:77
constexpr auto try_emplace(ConstIterator hint, K &&needle, Args &&... args)
Definition map_interface.h:307
constexpr auto upper_bound(Key const &needle) -> Iterator requires(
Definition map_interface.h:578
constexpr auto lower_bound(U &&needle) -> Iterator requires(
Definition map_interface.h:561
constexpr void clear()
Definition map_interface.h:51
constexpr auto insert(ConstIterator hint, Value const &value)
Definition map_interface.h:99
constexpr auto at(U &&needle) const -> Optional< Val const & >
Definition map_interface.h:459
constexpr auto contains(U &&needle) const -> bool
Definition map_interface.h:483
constexpr auto insert(Value &&value)
Definition map_interface.h:85
constexpr auto equal_range(Key const &needle) const
Definition map_interface.h:525
constexpr void insert_container(ConstIterator hint, Con &&container)
Definition map_interface.h:352
constexpr auto lower_bound(Key const &needle) const -> ConstIterator requires(
Definition map_interface.h:551
constexpr auto equal_range(U &&needle)
Definition map_interface.h:516
constexpr auto insert_or_assign(ConstIterator hint, Key const &needle, U &&value)
Definition map_interface.h:187
constexpr auto at(Key const &needle) const -> Optional< Val const & >
Definition map_interface.h:442
constexpr auto insert_or_assign(Key const &needle, U &&value)
Definition map_interface.h:123
constexpr auto try_emplace(Key &&needle, Args &&... args)
Definition map_interface.h:263
constexpr auto emplace_hint(ConstIterator hint, Args &&... args)
Definition map_interface.h:325
constexpr auto insert_or_assign(Key &&needle, U &&value)
Definition map_interface.h:145
constexpr auto insert(ConstIterator hint, Value &&value)
Definition map_interface.h:107
constexpr auto upper_bound(U &&needle) -> Iterator requires(
Definition map_interface.h:595
constexpr auto erase(Iterator first, Iterator last) -> Iterator
Definition map_interface.h:369
constexpr auto try_emplace(ConstIterator hint, Key const &needle, Args &&... args)
Definition map_interface.h:285
constexpr auto insert_container(Con &&container)
Definition map_interface.h:330
constexpr auto count(U &&needle) const -> size_t
Definition map_interface.h:497
constexpr auto find(U &&needle) const -> ConstIterator
Definition map_interface.h:476
constexpr auto erase(Key const &needle) -> size_t
Definition map_interface.h:376
constexpr auto operator[](Key const &needle) -> decltype(auto) requires(!is_multi &&concepts::Clonable< Key > &&concepts::DefaultConstructible< Val >)
Definition map_interface.h:53
constexpr auto merge(Self &self)
Definition map_interface.h:364
constexpr auto merge(Self &&self)
Definition map_interface.h:365
constexpr auto contains(Key const &needle) const -> bool
Definition map_interface.h:480
constexpr auto empty() const -> bool
Definition map_interface.h:49
constexpr auto insert_or_assign(K &&needle, U &&value)
Definition map_interface.h:165
constexpr auto at(Key const &needle) -> Optional< Val & >
Definition map_interface.h:436
constexpr auto insert(ConstIterator hint, U &&value)
Definition map_interface.h:115
constexpr auto try_emplace(ConstIterator hint, Key &&needle, Args &&... args)
Definition map_interface.h:297
constexpr auto find(U &&needle) -> Iterator
Definition map_interface.h:471
constexpr auto operator[](Key &&needle) -> decltype(auto) requires(!is_multi &&concepts::DefaultConstructible< Val >)
Definition map_interface.h:61
constexpr auto insert_or_assign(ConstIterator, K &&needle, U &&value)
Definition map_interface.h:229
constexpr friend auto tag_invoke(types::Tag< util::create_in_place >, InPlaceType< Self >, Con &&container, Args &&... args)
Definition map_interface.h:41
constexpr auto back() const -> Optional< Value const & >
Definition map_interface.h:430
constexpr auto insert(U &&value)
Definition map_interface.h:93
constexpr friend auto tag_invoke(T, Self &self, F &&function) -> usize
Definition map_interface.h:615
constexpr auto erase(U &&needle) -> size_t
Definition map_interface.h:396
constexpr auto lower_bound(Key const &needle) -> Iterator requires(
Definition map_interface.h:544
constexpr auto front() -> Optional< Value & >
Definition map_interface.h:414
constexpr auto equal_range(U &&needle) const
Definition map_interface.h:535
constexpr auto find(Key const &needle) -> Iterator
Definition map_interface.h:466
constexpr auto emplace(Args &&... args)
Definition map_interface.h:319
constexpr auto upper_bound(Key const &needle) const -> ConstIterator requires(
Definition map_interface.h:585
constexpr auto insert_or_assign(ConstIterator hint, Key &&needle, U &&value)
Definition map_interface.h:209
constexpr auto front() const -> Optional< Value const & >
Definition map_interface.h:419
constexpr auto try_emplace(Key const &needle, Args &&... args)
Definition map_interface.h:251
constexpr auto equal_range(Key const &needle)
Definition map_interface.h:505
constexpr auto back() -> Optional< Value & >
Definition map_interface.h:425
constexpr auto at(U &&needle) -> Optional< Val & >
Definition map_interface.h:451
constexpr auto find(Key const &needle) const -> ConstIterator
Definition map_interface.h:467
constexpr auto try_emplace(K &&needle, Args &&... args)
Definition map_interface.h:273
constexpr auto erase(Iterator position)
Definition map_interface.h:367
constexpr auto lower_bound(U &&needle) const -> ConstIterator requires(
Definition map_interface.h:570
Definition optional_forward_declaration.h:5
Definition operations.h:11
Definition operations.h:24
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 get(T &&value) -> decltype(auto)
Definition get.h:8
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 as_fallible
Definition as_fallible.h:26
constexpr auto try_infallible
Definition try_infallible.h:31
constexpr auto if_success
Definition if_success.h:31
constexpr auto lift_bool
Definition lift_bool.h:13
@ Self
Definition local_apic.h:126
Definition in_place_type.h:5