2#include <unordered_map>
13template<Mapable Key, Mapable AltKey,
typename Value>
16 std::unordered_map<Key,Value> map;
20 constexpr std::optional<AltKey>
getAlternative(
const Key & key)
const noexcept {
21 return keyMap.
getTo(key);
24 constexpr std::optional<Key>
getKey(
const AltKey & key)
const noexcept {
28 constexpr std::optional<Value>
getFromKey(
const Key & key)
const noexcept {
29 if(not map.contains(key))
35 return keyMap.
getFrom(secondaryKey).and_then([
this](
const Key & primaryKey) {
41 if(not map.contains(key))
50 constexpr std::optional<Value>
get(
const Key & key)
const noexcept requires(not std::convertible_to<Key,AltKey>) {
54 constexpr std::optional<Value>
get(
const AltKey & key)
const noexcept requires(not std::convertible_to<AltKey,Key>){
58 constexpr Value
getOrElse(
const Key & key, Value defaultValue)
const noexcept requires(not std::convertible_to<Key,AltKey>) {
62 constexpr Value
getOrElse(
const AltKey & secondaryKey, Value defaultValue)
const noexcept requires(not std::convertible_to<Key,AltKey>) {
67 return map.contains(key);
71 return keyMap.containsTo(key);
74 constexpr bool contains(
const Key & key)
const noexcept requires(not std::convertible_to<Key,AltKey>) {
75 return containsPrimary(key);
78 constexpr bool contains(
const AltKey & key)
const noexcept requires(not std::convertible_to<Key,AltKey>) {
82 constexpr bool insert(
const Key & key,
const AltKey & secondaryKey, Value value)
noexcept {
83 auto valueInsert = map.try_emplace(key,std::move(value));
84 if(not valueInsert.second)
86 keyMap.insert(key,secondaryKey);
91 if(keyMap.containsTo(secondaryKey) || not map.contains(key))
93 keyMap.insert(key,secondaryKey);
98 auto valueErase = map.erase(key);
101 return keyMap.eraseFrom(key);
105 auto primary = keyMap.
getFrom(key);
111 constexpr bool erase(
const Key & key)
noexcept requires(not std::convertible_to<Key,AltKey>){
112 return erasePrimary(key);
115 constexpr bool erase(
const AltKey & key)
noexcept requires(not std::convertible_to<Key,AltKey>) {
123 constexpr auto end() noexcept {
127 constexpr auto begin() const noexcept {
131 constexpr auto end() const noexcept {
139 constexpr auto cend() const noexcept {
143 constexpr bool empty() const noexcept {
147 constexpr size_t size() const noexcept {
Map that can use two different keys to value. Uses Bidirectional Map for mapping of primary and secon...
Definition AlternativeKeyMap.hpp:14
constexpr Value getFromAlternativeOrElse(const AltKey &secondaryKey, Value defaultValue) const noexcept
Definition AlternativeKeyMap.hpp:46
constexpr bool eraseFromKey(const Key &key) noexcept
Definition AlternativeKeyMap.hpp:97
constexpr bool containsAlternative(const AltKey &key) const noexcept
Definition AlternativeKeyMap.hpp:70
constexpr bool eraseFromAlternative(const AltKey &key) noexcept
Definition AlternativeKeyMap.hpp:104
constexpr Value getFromKeyOrElse(const Key &key, Value defaultValue) const noexcept
Definition AlternativeKeyMap.hpp:40
constexpr bool containsKey(const Key &key) const noexcept
Definition AlternativeKeyMap.hpp:66
constexpr auto begin() noexcept
Definition AlternativeKeyMap.hpp:119
constexpr std::optional< Key > getKey(const AltKey &key) const noexcept
Definition AlternativeKeyMap.hpp:24
constexpr bool updateAlternative(const Key &key, const AltKey &secondaryKey) noexcept
Definition AlternativeKeyMap.hpp:90
constexpr auto begin() const noexcept
Definition AlternativeKeyMap.hpp:127
constexpr bool contains(const AltKey &key) const noexcept
Definition AlternativeKeyMap.hpp:78
constexpr Value getOrElse(const Key &key, Value defaultValue) const noexcept
Definition AlternativeKeyMap.hpp:58
constexpr Value getOrElse(const AltKey &secondaryKey, Value defaultValue) const noexcept
Definition AlternativeKeyMap.hpp:62
constexpr std::optional< AltKey > getAlternative(const Key &key) const noexcept
Definition AlternativeKeyMap.hpp:20
constexpr auto end() noexcept
Definition AlternativeKeyMap.hpp:123
constexpr auto end() const noexcept
Definition AlternativeKeyMap.hpp:131
constexpr std::optional< Value > get(const Key &key) const noexcept
Definition AlternativeKeyMap.hpp:50
constexpr std::optional< Value > getFromAlternative(const AltKey &secondaryKey) const noexcept
Definition AlternativeKeyMap.hpp:34
constexpr bool erase(const AltKey &key) noexcept
Definition AlternativeKeyMap.hpp:115
constexpr bool empty() const noexcept
Definition AlternativeKeyMap.hpp:143
constexpr bool contains(const Key &key) const noexcept
Definition AlternativeKeyMap.hpp:74
constexpr auto cbegin() const noexcept
Definition AlternativeKeyMap.hpp:135
constexpr auto cend() const noexcept
Definition AlternativeKeyMap.hpp:139
constexpr bool insert(const Key &key, const AltKey &secondaryKey, Value value) noexcept
Definition AlternativeKeyMap.hpp:82
constexpr std::optional< Value > getFromKey(const Key &key) const noexcept
Definition AlternativeKeyMap.hpp:28
constexpr size_t size() const noexcept
Definition AlternativeKeyMap.hpp:147
constexpr bool erase(const Key &key) noexcept
Definition AlternativeKeyMap.hpp:111
constexpr std::optional< Value > get(const AltKey &key) const noexcept
Definition AlternativeKeyMap.hpp:54
constexpr void clear() noexcept
Definition AlternativeKeyMap.hpp:151
Bidirectional Hash Map. Behaves like a regular map, but also implements fast reversed look-up in trad...
Definition BidirectionalMap.hpp:169
constexpr std::optional< from_type > getFrom(const to_type &key) const noexcept
Definition BidirectionalMap.hpp:198
constexpr std::optional< to_type > getTo(const from_type &key) const noexcept
Definition BidirectionalMap.hpp:192
Definition AlternativeKeyMap.hpp:4