3#include <unordered_map>
15template<Mapable OuterKey, Mapable InnerKey,
typename Value>
18 using InnerMap = std::unordered_map<InnerKey,Value>;
19 std::unordered_map<OuterKey,InnerMap> map;
20 const static inline InnerMap EMPTY_INNER_MAP = InnerMap();
23 constexpr std::optional<Value>
get(
const OuterKey & key,
const InnerKey & innerKey)
const noexcept {
24 if(not map.contains(key) || not map.at(key).contains(innerKey)) {
27 return map.at(key).at(innerKey);
30 constexpr auto innerMap(
const OuterKey & key )
const noexcept {
31 return map.contains(key) ? std::views::all(map.at(key)):std::views::all(EMPTY_INNER_MAP);
34 constexpr Value
getOrElse(
const OuterKey & key,
const InnerKey & innerKey, Value defaultValue)
const noexcept {
35 return get(key,innerKey).value_or(defaultValue);
38 constexpr void erase(
const OuterKey & key,
const InnerKey & innerKey)
noexcept {
39 if(not map.contains(key))
41 map.at(key).erase(innerKey);
49 std::ranges::for_each(map,[&key](
auto & keyToMapPair){keyToMapPair.second.erase(key);});
52 constexpr void try_insert(
const OuterKey & key)
noexcept {
53 if(not map.contains(key)) {
54 map.try_emplace(key,InnerMap());
58 constexpr void insert(
const OuterKey & key,
const InnerKey & innerKey, Value value)
noexcept {
59 if(not map.contains(key)) {
60 map.try_emplace(key,InnerMap());
62 map.at(key).insert_or_assign(innerKey,value);
65 constexpr bool try_insert(
const OuterKey & key,
const InnerKey & innerKey, Value value)
noexcept {
66 if(not map.contains(key)) {
67 map.try_emplace(key,InnerMap());
69 return map.at(key).try_emplace(innerKey,value).second;
72 constexpr bool contains(
const OuterKey & key,
const InnerKey & innerKey)
const noexcept {
73 return map.contains(key) && map.at(key).contains(innerKey);
76 constexpr bool contains(
const OuterKey & key)
const noexcept {
77 return map.contains(key);
81 return map.contains(key);
84 constexpr size_t size() const noexcept {
88 constexpr size_t size(
const OuterKey & key)
const noexcept {
89 return map.contains(key) ? map.at(key).size(): 0;
Composite Map with the following mapping: OuterKey -> (InnerKey -> Value)
Definition NestedMap.hpp:16
constexpr void eraseInnerKey(const InnerKey &key) noexcept
Definition NestedMap.hpp:48
constexpr void eraseOuterKey(const OuterKey &key) noexcept
Definition NestedMap.hpp:44
constexpr bool containsOuterKey(const OuterKey &key) const noexcept
Definition NestedMap.hpp:80
constexpr Value getOrElse(const OuterKey &key, const InnerKey &innerKey, Value defaultValue) const noexcept
Definition NestedMap.hpp:34
constexpr void try_insert(const OuterKey &key) noexcept
Definition NestedMap.hpp:52
constexpr auto innerMap(const OuterKey &key) const noexcept
Definition NestedMap.hpp:30
constexpr void insert(const OuterKey &key, const InnerKey &innerKey, Value value) noexcept
Definition NestedMap.hpp:58
constexpr size_t size(const OuterKey &key) const noexcept
Definition NestedMap.hpp:88
constexpr void erase(const OuterKey &key, const InnerKey &innerKey) noexcept
Definition NestedMap.hpp:38
constexpr bool try_insert(const OuterKey &key, const InnerKey &innerKey, Value value) noexcept
Definition NestedMap.hpp:65
constexpr bool contains(const OuterKey &key) const noexcept
Definition NestedMap.hpp:76
constexpr size_t size() const noexcept
Definition NestedMap.hpp:84
constexpr std::optional< Value > get(const OuterKey &key, const InnerKey &innerKey) const noexcept
Definition NestedMap.hpp:23
constexpr bool contains(const OuterKey &key, const InnerKey &innerKey) const noexcept
Definition NestedMap.hpp:72
Definition AlternativeKeyMap.hpp:4