sandbox
Loading...
Searching...
No Matches
bimap.hpp
1// SPDX-License-Identifier: MIT
2#ifndef LIBSBX_CONTAINERS_BIMAP_HPP_
3#define LIBSBX_CONTAINERS_BIMAP_HPP_
4
5#include <unordered_map>
6#include <map>
7#include <optional>
8
9namespace sbx::containers {
10
11template<template<typename, typename> typename Map, typename Key, typename Value>
13
14 template<typename K, typename V>
15 using map_type = Map<K, V>;
16
17 using forward_map_type = map_type<Key, Value>;
18 using reverse_map_type = map_type<Value, Key>;
19
20public:
21
22 using key_type = Key;
23 using value_type = Value;
24
25 auto insert(const Key& key, const Value& value) -> void {
26 _forward.insert({key, value});
27 _reverse.insert({value, key});
28 }
29
30 auto erase_key(const key_type& key) -> void {
31 _reverse.erase(_forward[key]);
32 _forward.erase(key);
33 }
34
35 auto erase_value(const value_type& value) -> void {
36 _forward.erase(_reverse[value]);
37 _reverse.erase(value);
38 }
39
40 auto find_key(const value_type& value) -> std::optional<std::reference_wrapper<key_type>> {
41 if (auto entry = _reverse.find(value); entry != _reverse.end()) {
42 return std::ref(entry->second);
43 }
44
45 return std::nullopt;
46 }
47
48 auto find_value(const key_type& key) -> std::optional<std::reference_wrapper<value_type>> {
49 if (auto entry = _forward.find(key); entry != _forward.end()) {
50 return std::ref(entry->second);
51 }
52
53 return std::nullopt;
54 }
55
56private:
57
58 forward_map_type _forward;
59 reverse_map_type _reverse;
60
61}; // class bimap
62
63template<typename Key, typename Value>
65
66} // namespace sbx::containers
67
68#endif // LIBSBX_CONTAINERS_BIMAP_HPP_
Definition: bimap.hpp:12