8#ifndef INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_INLINE_CONTAINER_MAP_REFERENCE_HPP_
9#define INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_INLINE_CONTAINER_MAP_REFERENCE_HPP_
12#include "arene/base/constraints/constraints.hpp"
13#include "arene/base/detail/exceptions.hpp"
14#include "arene/base/functional/function_traits.hpp"
15#include "arene/base/inline_container/detail/compare.hpp"
16#include "arene/base/inline_container/detail/container_base_type.hpp"
17#include "arene/base/inline_container/detail/erased_member_function.hpp"
18#include "arene/base/inline_container/detail/range_interface.hpp"
19#include "arene/base/inline_container/map.hpp"
20#include "arene/base/inline_container/map_reference_iterator.hpp"
21#include "arene/base/iterator/reverse_iterator.hpp"
22#include "arene/base/stdlib_choice/cstddef.hpp"
23#include "arene/base/stdlib_choice/enable_if.hpp"
24#include "arene/base/stdlib_choice/is_copy_constructible.hpp"
25#include "arene/base/stdlib_choice/is_same.hpp"
26#include "arene/base/stdlib_choice/pair.hpp"
27#include "arene/base/type_manipulation/smallest_integer_for.hpp"
37namespace inline_map_reference_detail {
43template <
class Key,
class Compare>
44extern constexpr bool comparison_is_noexcept_v{inline_container::detail::compare_wrapper<Compare, Key>::
45 template comparison_is_noexcept<Key>};
49template <
class MapBase>
50using iterator = inline_map_reference_iterator<MapBase,
false>;
55template <
class MapBase>
56using const_iterator = inline_map_reference_iterator<MapBase,
true>;
61template <
class MapBase>
62struct const_operations {
67 template <
class R,
class... Ts>
68 using erased_op_type =
auto (*)(MapBase
const*, Ts...) -> R;
71 erased_op_type<
typename MapBase::compare_type> key_comp;
73 erased_op_type<
typename MapBase::size_type> size;
75 erased_op_type<
typename MapBase::size_type> capacity;
77 erased_op_type<
typename MapBase::size_type> max_size;
79 erased_op_type<const_iterator<MapBase>,
typename MapBase::key_type
const&> find;
81 erased_op_type<
bool,
typename MapBase::key_type
const&> contains;
83 erased_op_type<
typename MapBase::size_type,
typename MapBase::key_type
const&> count;
85 erased_op_type<const_iterator<MapBase>,
typename MapBase::key_type
const&> lower_bound;
87 erased_op_type<const_iterator<MapBase>,
typename MapBase::key_type
const&> upper_bound;
89 erased_op_type<std::pair<const_iterator<MapBase>, const_iterator<MapBase>>,
typename MapBase::key_type
const&>
92 erased_op_type<
typename MapBase::mapped_type
const&,
typename MapBase::key_type
const&> at;
94 erased_op_type<const_iterator<MapBase>> begin;
96 erased_op_type<const_iterator<MapBase>> end;
102template <
class MapBase>
108 template <
class R,
class... Ts>
109 using erased_op_type =
auto (*)(MapBase*, Ts...) -> R;
113 const_operations<MapBase>
const* const_ops;
115 erased_op_type<iterator<MapBase>,
typename MapBase::key_type
const&> find;
117 erased_op_type<iterator<MapBase>,
typename MapBase::key_type
const&> lower_bound;
119 erased_op_type<iterator<MapBase>,
typename MapBase::key_type
const&> upper_bound;
121 erased_op_type<std::pair<iterator<MapBase>, iterator<MapBase>>,
typename MapBase::key_type
const&> equal_range;
123 erased_op_type<
typename MapBase::mapped_type&,
typename MapBase::key_type
const&> operator_index;
125 erased_op_type<
typename MapBase::mapped_type&,
typename MapBase::key_type
const&> at;
127 erased_op_type<std::pair<iterator<MapBase>,
bool>,
typename MapBase::value_type
const&> insert;
130 std::pair<iterator<MapBase>,
bool>,
131 typename MapBase::key_type
const&,
132 typename MapBase::mapped_type
const&>
135 erased_op_type<iterator<MapBase>,
typename MapBase::key_type
const&> erase_key;
137 erased_op_type<iterator<MapBase>, const_iterator<MapBase>> erase_pos;
139 erased_op_type<iterator<MapBase>, const_iterator<MapBase>, const_iterator<MapBase>> erase_rng;
141 erased_op_type<
void> clear;
143 erased_op_type<iterator<MapBase>> begin;
145 erased_op_type<iterator<MapBase>> end;
153template <
class MemFn, MemFn Func,
class Return = member_function_return_t<MemFn>>
154extern constexpr auto erased_member_function = inline_container::detail::erased_member_function<MemFn, Func, Return>;
162template <
class Map,
class T, T Value,
class MapBase = inline_container::detail::container_base_type_t<Map>>
163auto erased_integral_constant_function(MapBase
const*)
noexcept -> T {
185 class MapBase = inline_container::detail::container_base_type_t<Map>,
186 bool ComparisonIsNoexcept = comparison_is_noexcept_v<
typename Map::key_type,
typename Map::compare_type>>
187extern constexpr auto const_map_operations_with_at = const_operations<MapBase>{
188 erased_member_function<
decltype(&Map::key_comp), &Map::key_comp>,
189 erased_member_function<
decltype(&Map::size), &Map::size>,
190 &erased_integral_constant_function<Map, std::size_t, Map::capacity>,
191 &erased_integral_constant_function<Map, std::size_t, Map::max_size>,
192 erased_member_function<
193 auto (Map::*)(
typename Map::key_type
const&)
const noexcept(ComparisonIsNoexcept)->
typename Map::const_iterator,
195 const_iterator<MapBase>>,
196 erased_member_function<
197 auto (Map::*)(
typename Map::key_type
const&)
const noexcept(ComparisonIsNoexcept)->
bool,
199 erased_member_function<
200 auto (Map::*)(
typename Map::key_type
const&)
const noexcept(ComparisonIsNoexcept)->
typename Map::size_type,
202 erased_member_function<
203 auto (Map::*)(
typename Map::key_type
const&)
const noexcept(ComparisonIsNoexcept)->
typename Map::const_iterator,
205 const_iterator<MapBase>>,
206 erased_member_function<
207 auto (Map::*)(
typename Map::key_type
const&)
const noexcept(ComparisonIsNoexcept)->
typename Map::const_iterator,
209 const_iterator<MapBase>>,
210 erased_member_function<
211 auto (Map::*)(
typename Map::key_type
const&)
const noexcept(ComparisonIsNoexcept)
212 ->std::pair<
typename Map::const_iterator,
typename Map::const_iterator>,
214 std::pair<const_iterator<MapBase>, const_iterator<MapBase>>>,
215 erased_member_function<
216 auto (Map::*)(
typename Map::key_type
const&)
const noexcept(
false)->
typename Map::mapped_type
const&,
218 erased_member_function<
decltype(&Map::cbegin), &Map::begin, const_iterator<MapBase>>,
219 erased_member_function<
decltype(&Map::cend), &Map::end, const_iterator<MapBase>>
240 class MapBase = inline_container::detail::container_base_type_t<Map>,
241 bool ComparisonIsNoexcept = comparison_is_noexcept_v<
typename Map::key_type,
typename Map::compare_type>>
242extern constexpr auto const_map_operations_without_at = const_operations<MapBase>{
243 erased_member_function<
decltype(&Map::key_comp), &Map::key_comp>,
244 erased_member_function<
decltype(&Map::size), &Map::size>,
245 &erased_integral_constant_function<Map, std::size_t, Map::capacity>,
246 &erased_integral_constant_function<Map, std::size_t, Map::max_size>,
247 erased_member_function<
248 auto (Map::*)(
typename Map::key_type
const&)
const noexcept(ComparisonIsNoexcept)->
typename Map::const_iterator,
250 const_iterator<MapBase>>,
251 erased_member_function<
252 auto (Map::*)(
typename Map::key_type
const&)
const noexcept(ComparisonIsNoexcept)->
bool,
254 erased_member_function<
255 auto (Map::*)(
typename Map::key_type
const&)
const noexcept(ComparisonIsNoexcept)->
typename Map::size_type,
257 erased_member_function<
258 auto (Map::*)(
typename Map::key_type
const&)
const noexcept(ComparisonIsNoexcept)->
typename Map::const_iterator,
260 const_iterator<MapBase>>,
261 erased_member_function<
262 auto (Map::*)(
typename Map::key_type
const&)
const noexcept(ComparisonIsNoexcept)->
typename Map::const_iterator,
264 const_iterator<MapBase>>,
265 erased_member_function<
266 auto (Map::*)(
typename Map::key_type
const&)
const noexcept(ComparisonIsNoexcept)
267 ->std::pair<
typename Map::const_iterator,
typename Map::const_iterator>,
269 std::pair<const_iterator<MapBase>, const_iterator<MapBase>>>,
271 erased_member_function<
decltype(&Map::cbegin), &Map::begin, const_iterator<MapBase>>,
272 erased_member_function<
decltype(&Map::cend), &Map::end, const_iterator<MapBase>>
282template <
class Map,
class MapBase = inline_container::detail::container_base_type_t<Map>>
283class erase_fn_iterator_argument_adaptor : inline_map_detail::inline_map_passkey_base<MapBase> {
288 static auto restored(const_iterator<MapBase> iter)
noexcept ->
typename Map::const_iterator {
289 using index_type = smallest_unsigned_integer_for<Map::capacity>;
291 constexpr auto passkey =
typename inline_map_detail::inline_map_passkey_base<MapBase>::inline_map_passkey{};
293 return typename Map::const_iterator{
295 static_cast<Map
const*>(iter.get_map(passkey)),
296 static_cast<index_type>(iter.get_index(passkey))
304 static auto derived(MapBase* map)
noexcept -> Map& {
return *
static_cast<Map*>(map); }
314 static auto one_argument_overload(MapBase* map, const_iterator<MapBase> pos)
noexcept -> iterator<MapBase> {
315 return iterator<MapBase>{derived(map).erase(restored(pos))};
326 static auto two_argument_overload(MapBase* map, const_iterator<MapBase> first, const_iterator<MapBase> last)
noexcept
327 -> iterator<MapBase> {
328 return iterator<MapBase>{derived(map).erase(restored(first), restored(last))};
350 class MapBase = inline_container::detail::container_base_type_t<Map>,
351 bool ComparisonIsNoexcept = comparison_is_noexcept_v<
typename Map::key_type,
typename Map::compare_type>>
352extern constexpr auto map_operations_with_at = operations<MapBase> {
353 &const_map_operations_with_at<Map>,
354 erased_member_function<
355 auto (Map::*)(
typename Map::key_type
const&)
noexcept(ComparisonIsNoexcept)->
typename Map::iterator,
358 erased_member_function<
359 auto (Map::*)(
typename Map::key_type
const&)
noexcept(ComparisonIsNoexcept)->
typename Map::iterator,
362 erased_member_function<
363 auto (Map::*)(
typename Map::key_type
const&)
noexcept(ComparisonIsNoexcept)->
typename Map::iterator,
366 erased_member_function<
367 auto (Map::*)(
typename Map::key_type
const&)
noexcept(ComparisonIsNoexcept)
368 ->std::pair<
typename Map::iterator,
typename Map::iterator>,
370 std::pair<iterator<MapBase>, iterator<MapBase>>>,
371 erased_member_function <
auto (Map::*)(
typename Map::key_type
const&)
noexcept(
false)->
typename Map::mapped_type&,
373 erased_member_function<
374 auto (Map::*)(
typename Map::key_type
const&)
noexcept(
false)->
typename Map::mapped_type&,
376 erased_member_function<
377 auto (Map::*)(
typename Map::value_type
const&)
noexcept(
false)->std::pair<
typename Map::iterator,
bool>,
379 std::pair<iterator<MapBase>,
bool>>,
380 erased_member_function<
381 auto (Map::*)(
typename Map::key_type
const&,
typename Map::mapped_type
const&)
noexcept(
false)
382 ->std::pair<
typename Map::iterator,
bool>,
383 &Map::insert_or_assign,
384 std::pair<iterator<MapBase>,
bool>>,
385 erased_member_function<
386 auto (Map::*)(
typename Map::key_type
const&)
noexcept(ComparisonIsNoexcept)->
typename Map::iterator,
389 &erase_fn_iterator_argument_adaptor<Map>::one_argument_overload,
390 &erase_fn_iterator_argument_adaptor<Map>::two_argument_overload,
391 erased_member_function<
decltype(&Map::clear), &Map::clear>,
392 erased_member_function<
auto (Map::*)()
noexcept ->
typename Map::iterator, &Map::begin, iterator<MapBase>>,
393 erased_member_function<
auto (Map::*)()
noexcept ->
typename Map::iterator, &Map::end, iterator<MapBase>>
414 class MapBase = inline_container::detail::container_base_type_t<Map>,
415 bool ComparisonIsNoexcept = comparison_is_noexcept_v<
typename Map::key_type,
typename Map::compare_type>>
416extern constexpr auto map_operations_without_at = operations<MapBase> {
417 &const_map_operations_without_at<Map>,
418 erased_member_function<
419 auto (Map::*)(
typename Map::key_type
const&)
noexcept(ComparisonIsNoexcept)->
typename Map::iterator,
422 erased_member_function<
423 auto (Map::*)(
typename Map::key_type
const&)
noexcept(ComparisonIsNoexcept)->
typename Map::iterator,
426 erased_member_function<
427 auto (Map::*)(
typename Map::key_type
const&)
noexcept(ComparisonIsNoexcept)->
typename Map::iterator,
430 erased_member_function<
431 auto (Map::*)(
typename Map::key_type
const&)
noexcept(ComparisonIsNoexcept)
432 ->std::pair<
typename Map::iterator,
typename Map::iterator>,
434 std::pair<iterator<MapBase>, iterator<MapBase>>>,
435 erased_member_function <
auto (Map::*)(
typename Map::key_type
const&)
noexcept(
false)->
typename Map::mapped_type&,
438 erased_member_function<
439 auto (Map::*)(
typename Map::value_type
const&)
noexcept(
false)->std::pair<
typename Map::iterator,
bool>,
441 std::pair<iterator<MapBase>,
bool>>,
442 erased_member_function<
443 auto (Map::*)(
typename Map::key_type
const&,
typename Map::mapped_type
const&)
noexcept(
false)
444 ->std::pair<
typename Map::iterator,
bool>,
445 &Map::insert_or_assign,
446 std::pair<iterator<MapBase>,
bool>>,
447 erased_member_function<
448 auto (Map::*)(
typename Map::key_type
const&)
noexcept(ComparisonIsNoexcept)->
typename Map::iterator,
451 &erase_fn_iterator_argument_adaptor<Map>::one_argument_overload,
452 &erase_fn_iterator_argument_adaptor<Map>::two_argument_overload,
453 erased_member_function<
decltype(&Map::clear), &Map::clear>,
454 erased_member_function<
auto (Map::*)()
noexcept ->
typename Map::iterator, &Map::begin, iterator<MapBase>>,
455 erased_member_function<
auto (Map::*)()
noexcept ->
typename Map::iterator, &Map::end, iterator<MapBase>>
461template <
class Derived>
462class const_inline_map_reference_interface {
466 auto derived()
const noexcept -> Derived
const& {
return static_cast<Derived
const&>(*
this); }
473 auto map()
const noexcept ->
typename D::map_base_type
const* {
474 return derived().map_ptr();
482 auto ops()
const noexcept -> const_operations<
typename D::map_base_type>
const& {
483 return *derived().const_ops_ptr();
490 static constexpr bool comparison_is_noexcept{inline_map_reference_detail::comparison_is_noexcept_v<
491 typename D::key_type,
492 typename D::compare_type>};
510 template <
class Actual,
class Expected = Derived>
511 explicit const_inline_map_reference_interface(Actual*)
noexcept {
513 std::is_same<Actual, Expected>::value,
514 "'Derived' type mismatch.\n"
515 "Please verify that 'Derived' is defined correctly when using 'const_inline_map_reference_interface' as a CRTP "
520 ~const_inline_map_reference_interface() =
default;
522 const_inline_map_reference_interface(const_inline_map_reference_interface
const&) =
default;
524 const_inline_map_reference_interface(const_inline_map_reference_interface&&) =
default;
526 auto operator=(const_inline_map_reference_interface
const&) -> const_inline_map_reference_interface& =
default;
528 auto operator=(const_inline_map_reference_interface&&) -> const_inline_map_reference_interface& =
default;
533 template <
class D = Derived>
534 auto key_comp()
const noexcept(std::is_nothrow_copy_constructible<
typename D::compare_type>::value)
535 ->
decltype(ops<D>().key_comp(map<D>())) {
536 return ops<D>().key_comp(map<D>());
541 template <
class D = Derived>
542 auto size()
const noexcept ->
decltype(ops<D>().size(map<D>())) {
543 return ops<D>().size(map<D>());
548 template <
class D = Derived>
549 auto capacity()
const noexcept ->
decltype(ops<D>().capacity(map<D>())) {
550 return ops<D>().capacity(map<D>());
555 template <
class D = Derived>
556 auto max_size()
const noexcept ->
decltype(ops<D>().max_size(map<D>())) {
557 return ops<D>().max_size(map<D>());
563 template <
class D = Derived>
564 auto find(
typename D::key_type
const& key)
const noexcept(comparison_is_noexcept<D>)
565 ->
decltype(ops<D>().find(map<D>(), key)) {
566 return ops<D>().find(map<D>(), key);
573 template <
class D = Derived>
574 auto contains(
typename D::key_type
const& key)
const noexcept(comparison_is_noexcept<D>)
575 ->
decltype(ops<D>().contains(map<D>(), key)) {
576 return ops<D>().contains(map<D>(), key);
583 template <
class D = Derived>
584 auto count(
typename D::key_type
const& key)
const noexcept(comparison_is_noexcept<D>)
585 ->
decltype(ops<D>().count(map<D>(), key)) {
586 return ops<D>().count(map<D>(), key);
594 template <
class D = Derived>
595 auto lower_bound(
typename D::key_type
const& key)
const noexcept(comparison_is_noexcept<D>)
596 ->
decltype(ops<D>().lower_bound(map<D>(), key)) {
597 return ops<D>().lower_bound(map<D>(), key);
605 template <
class D = Derived>
606 auto upper_bound(
typename D::key_type
const& key)
const noexcept(comparison_is_noexcept<D>)
607 ->
decltype(ops<D>().upper_bound(map<D>(), key)) {
608 return ops<D>().upper_bound(map<D>(), key);
617 template <
class D = Derived>
618 auto equal_range(
typename D::key_type
const& key)
const noexcept(comparison_is_noexcept<D>)
619 ->
decltype(ops<D>().equal_range(map<D>(), key)) {
620 return ops<D>().equal_range(map<D>(), key);
631 bool AreExceptionsEnabled = detail::are_exceptions_enabled::value,
632 constraints<std::enable_if_t<AreExceptionsEnabled>> =
nullptr>
633 auto at(
typename D::key_type
const& key)
const noexcept(
false) ->
decltype(ops<D>().at(map<D>(), key)) {
634 return ops<D>().at(map<D>(), key);
639 template <
class D = Derived>
640 auto begin()
const noexcept ->
decltype(ops<D>().begin(map<D>())) {
641 return ops<D>().begin(map<D>());
646 template <
class D = Derived>
647 auto end()
const noexcept ->
decltype(ops<D>().end(map<D>())) {
648 return ops<D>().end(map<D>());
681template <
class Key,
class Value,
class Compare>
683 :
public inline_map_reference_detail::const_inline_map_reference_interface<
697 using key_type = Key;
699 using mapped_type = Value;
715 using compare_type = Compare;
719 using interface_base = inline_map_reference_detail::const_inline_map_reference_interface<
inline_map_reference>;
725 map_base_type* map_ptr_;
728 ops_type
const* ops_ptr_;
796 return ops_ptr_->find(map_ptr_, key);
806 return ops_ptr_->lower_bound(map_ptr_, key);
816 return ops_ptr_->upper_bound(map_ptr_, key);
827 return ops_ptr_->equal_range(map_ptr_, key);
843 return ops_ptr_->operator_index(map_ptr_, key);
964template <
class Key,
class Value,
class Compare>
966 :
public inline_map_reference_detail::const_inline_map_reference_interface<
977 using key_type = Key;
979 using mapped_type = Value;
995 using compare_type = Compare;
1005 map_base_type
const* map_ptr_;
1008 const_ops_type
const* const_ops_ptr_;
1063 : interface_base{
this},
A const reference class to an inline_map object, with size-erased type.
Definition map_reference.hpp:968
auto map_ptr() const noexcept -> map_base_type const *
obtain a pointer to the map base
Definition map_reference.hpp:1014
const_inline_map_reference(inline_map_reference< Key, Value, Compare > other) noexcept
construct a const_inline_map_reference from an inline_map_reference
Definition map_reference.hpp:1062
auto const_ops_ptr() const noexcept -> const_ops_type const *
obtain a pointer to the const operations
Definition map_reference.hpp:1019
A reference class to an inline_map object, with size-erased type.
Definition map_reference.hpp:685
auto operator[](key_type const &key) const noexcept(false) ->
obtain a reference to the mapped value for the specified key
Definition map_reference.hpp:842
auto equal_range(key_type const &key) const noexcept(comparison_is_noexcept) ->
find the sequence of elements whose keys compare equivalent to a given key
Definition map_reference.hpp:825
auto ops_ptr() const noexcept -> ops_type const *
obtain a pointer to the non-const operations
Definition map_reference.hpp:747
auto const_ops_ptr() const noexcept -> const_ops_type const *
obtain a pointer to the const operations
Definition map_reference.hpp:752
auto lower_bound(key_type const &key) const noexcept(comparison_is_noexcept) ->
find the first element which is not less than a given key
Definition map_reference.hpp:804
auto find(key_type const &key) const noexcept(comparison_is_noexcept) ->
obtain an iterator to the first element with a given key
Definition map_reference.hpp:795
auto upper_bound(key_type const &key) const noexcept(comparison_is_noexcept) ->
find the first element which is greater than a given key
Definition map_reference.hpp:814
auto map_ptr() const noexcept -> map_base_type *
obtain a pointer to the map base
Definition map_reference.hpp:742
Definition array_exceptions_disabled.cpp:11
Copyright 2026, Toyota Motor Corporation.
Definition array_exceptions_disabled.cpp:10