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