Fishnet 2.0.1
Framework for Graph-Based Analysis of GIS Vector Data
Loading...
Searching...
No Matches
NestedMap.hpp
Go to the documentation of this file.
1#pragma once
2#include <algorithm>
3#include <unordered_map>
5
6namespace fishnet::util {
7
15template<Mapable OuterKey, Mapable InnerKey, typename Value>
16class NestedMap {
17private:
18 using InnerMap = std::unordered_map<InnerKey,Value>;
19 std::unordered_map<OuterKey,InnerMap> map;
20 const static inline InnerMap EMPTY_INNER_MAP = InnerMap();
21
22public:
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)) {
25 return std::nullopt;
26 }
27 return map.at(key).at(innerKey);
28 }
29
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);
32 }
33
34 constexpr Value getOrElse(const OuterKey & key, const InnerKey & innerKey, Value defaultValue) const noexcept {
35 return get(key,innerKey).value_or(defaultValue);
36 }
37
38 constexpr void erase(const OuterKey & key, const InnerKey & innerKey) noexcept {
39 if(not map.contains(key))
40 return;
41 map.at(key).erase(innerKey);
42 }
43
44 constexpr void eraseOuterKey(const OuterKey & key) noexcept {
45 map.erase(key);
46 }
47
48 constexpr void eraseInnerKey(const InnerKey & key) noexcept {
49 std::ranges::for_each(map,[&key](auto & keyToMapPair){keyToMapPair.second.erase(key);});
50 }
51
52 constexpr void try_insert(const OuterKey & key) noexcept {
53 if(not map.contains(key)) {
54 map.try_emplace(key,InnerMap());
55 }
56 }
57
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());
61 }
62 map.at(key).insert_or_assign(innerKey,value);
63 }
64
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());
68 }
69 return map.at(key).try_emplace(innerKey,value).second;
70 }
71
72 constexpr bool contains(const OuterKey & key, const InnerKey & innerKey) const noexcept {
73 return map.contains(key) && map.at(key).contains(innerKey);
74 }
75
76 constexpr bool contains(const OuterKey & key) const noexcept {
77 return map.contains(key);
78 }
79
80 constexpr bool containsOuterKey(const OuterKey & key) const noexcept {
81 return map.contains(key);
82 }
83
84 constexpr size_t size() const noexcept {
85 return map.size();
86 }
87
88 constexpr size_t size(const OuterKey & key) const noexcept {
89 return map.contains(key) ? map.at(key).size(): 0;
90 }
91};
92}
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