8 std::unordered_map<T0, T1> mRight;
9 std::unordered_map<T1, T0> mLeft;
11 T1& operator[](T0
const& key) {
return mRight[key]; }
12 T1
const& operator[](T0
const& key)
const {
return mRight[key]; }
14 T0& operator()(T1
const& value) {
return mLeft[value]; }
15 T0
const& operator()(T1
const& value)
const {
return mLeft[value]; }
17 bool contains(T0
const& a)
const {
18 if constexpr (std::is_same_v<T0, T1>) {
19 return mLeft.contains(a) || mRight.contains(a);
21 return mRight.contains(a);
24 bool contains(T1
const& a)
const
25 requires(!std::is_same_v<T0, T1>)
27 return mLeft.contains(a);
29 void emplace(T0
const& a1, T1
const& a2) {
30 mRight.emplace(a1, a2);
31 mLeft.emplace(a2, a1);
33 void insert_or_assign(T0
const& a1, T1
const& a2) {
34 mRight.insert_or_assign(a1, a2);
35 mLeft.insert_or_assign(a2, a1);
37 void eraser(T0
const& a) {
38 if (!mRight.contains(a)) {
42 mLeft.erase(mRight[a]);
44 void erasel(T1
const& a) {
45 if (!mLeft.contains(a)) {
49 mRight.erase(mLeft[a]);
51 void erase(T0
const& a)
52 requires(!std::is_same_v<T0, T1>)
56 void erase(T1
const& a)
57 requires(!std::is_same_v<T0, T1>)
61 T1& atr(T0
const& a) {
return mRight.at(a); }
62 T0& atl(T1
const& a) {
return mLeft.at(a); }
64 requires(!std::is_same_v<T0, T1>)
69 requires(!std::is_same_v<T0, T1>)
73 T1
const& atr(T0
const& a)
const {
return mRight.at(a); }
74 T0
const& atl(T1
const& a)
const {
return mLeft.at(a); }
75 T1
const& at(T0
const& a)
const
76 requires(!std::is_same_v<T0, T1>)
80 T0
const& at(T1
const& a)
const
81 requires(!std::is_same_v<T0, T1>)