2#ifndef LIBSBX_CONTAINERS_BIMAP_HPP_
3#define LIBSBX_CONTAINERS_BIMAP_HPP_
5#include <unordered_map>
9namespace sbx::containers {
11template<
template<
typename,
typename>
typename Map,
typename Key,
typename Value>
14 template<
typename K,
typename V>
15 using map_type = Map<K, V>;
17 using forward_map_type = map_type<Key, Value>;
18 using reverse_map_type = map_type<Value, Key>;
23 using value_type = Value;
25 auto insert(
const Key& key,
const Value& value) ->
void {
26 _forward.insert({key, value});
27 _reverse.insert({value, key});
30 auto erase_key(
const key_type& key) ->
void {
31 _reverse.erase(_forward[key]);
35 auto erase_value(
const value_type& value) ->
void {
36 _forward.erase(_reverse[value]);
37 _reverse.erase(value);
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);
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);
58 forward_map_type _forward;
59 reverse_map_type _reverse;
63template<
typename Key,
typename Value>