LeviLamina
Loading...
Searching...
No Matches
BidirectionalUnorderedMap.h
1#pragma once
2
3#include "mc/_HeaderOutputPredefine.h"
4
5template <typename T0, typename T1>
7public:
8 std::unordered_map<T0, T1> mRight;
9 std::unordered_map<T1, T0> mLeft;
10
11 T1& operator[](T0 const& key) { return mRight[key]; }
12 T1 const& operator[](T0 const& key) const { return mRight[key]; }
13
14 T0& operator()(T1 const& value) { return mLeft[value]; }
15 T0 const& operator()(T1 const& value) const { return mLeft[value]; }
16
17 bool contains(T0 const& a) const {
18 if constexpr (std::is_same_v<T0, T1>) {
19 return mLeft.contains(a) || mRight.contains(a);
20 } else {
21 return mRight.contains(a);
22 }
23 }
24 bool contains(T1 const& a) const
25 requires(!std::is_same_v<T0, T1>)
26 {
27 return mLeft.contains(a);
28 }
29 void emplace(T0 const& a1, T1 const& a2) {
30 mRight.emplace(a1, a2);
31 mLeft.emplace(a2, a1);
32 }
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);
36 }
37 void eraser(T0 const& a) {
38 if (!mRight.contains(a)) {
39 return;
40 }
41 mRight.erase(a);
42 mLeft.erase(mRight[a]);
43 }
44 void erasel(T1 const& a) {
45 if (!mLeft.contains(a)) {
46 return;
47 }
48 mLeft.erase(a);
49 mRight.erase(mLeft[a]);
50 }
51 void erase(T0 const& a)
52 requires(!std::is_same_v<T0, T1>)
53 {
54 eraser(a);
55 }
56 void erase(T1 const& a)
57 requires(!std::is_same_v<T0, T1>)
58 {
59 erasel(a);
60 }
61 T1& atr(T0 const& a) { return mRight.at(a); }
62 T0& atl(T1 const& a) { return mLeft.at(a); }
63 T1& at(T0 const& a)
64 requires(!std::is_same_v<T0, T1>)
65 {
66 return atr(a);
67 }
68 T0& at(T1 const& a)
69 requires(!std::is_same_v<T0, T1>)
70 {
71 return atl(a);
72 }
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>)
77 {
78 return atr(a);
79 }
80 T0 const& at(T1 const& a) const
81 requires(!std::is_same_v<T0, T1>)
82 {
83 return atl(a);
84 }
85};
Definition BidirectionalUnorderedMap.h:6