1#ifndef LIBSBX_CONTAINERS_BIMAP_HPP_
2#define LIBSBX_CONTAINERS_BIMAP_HPP_
4#include <unordered_map>
8namespace sbx::containers {
10template<
template<
typename,
typename>
typename Map,
typename Key,
typename Value>
13 template<
typename K,
typename V>
14 using map_type = Map<K, V>;
16 using forward_map_type = map_type<Key, Value>;
17 using reverse_map_type = map_type<Value, Key>;
22 using value_type = Value;
24 auto insert(
const Key& key,
const Value& value) ->
void {
25 _forward.insert({key, value});
26 _reverse.insert({value, key});
29 auto erase_key(
const key_type& key) ->
void {
30 _reverse.erase(_forward[key]);
34 auto erase_value(
const value_type& value) ->
void {
35 _forward.erase(_reverse[value]);
36 _reverse.erase(value);
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);
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);
57 forward_map_type _forward;
58 reverse_map_type _reverse;
62template<
typename Key,
typename Value>