aboutsummaryrefslogtreecommitdiff
path: root/src/brussel.common/LookupTable.hpp
diff options
context:
space:
mode:
authorrtk0c <[email protected]>2023-10-19 22:50:07 -0700
committerrtk0c <[email protected]>2023-10-19 22:50:07 -0700
commit2c92e07f337e42cf58970443f9de678f85a9b2a4 (patch)
tree075d5407e1e12a9d35cbee6e4c20ad34e0765c42 /src/brussel.common/LookupTable.hpp
parent615809c036f604bce4582cea8ad49c64693f4f45 (diff)
The great renaming: switch to "module style"
Diffstat (limited to 'src/brussel.common/LookupTable.hpp')
-rw-r--r--src/brussel.common/LookupTable.hpp64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/brussel.common/LookupTable.hpp b/src/brussel.common/LookupTable.hpp
new file mode 100644
index 0000000..54548f2
--- /dev/null
+++ b/src/brussel.common/LookupTable.hpp
@@ -0,0 +1,64 @@
+#pragma once
+
+#include <robin_hood.h>
+#include <string_view>
+
+// BIDI stands for bi-directional
+#define BIDI_LUT_DECL(name, aType, aCount, bType, bCount) \
+ int gLutBidi_##name##_A2B[aCount]; \
+ int gLutBidi_##name##_B2A[bCount]; \
+ using name##AType = aType; \
+ using name##BType = bType; \
+ void InitializeLutBidi##name()
+#define BIDI_LUT_MAP_FOR(name) \
+ int* lutMappingA2B = gLutBidi_##name##_A2B; \
+ int* lutMappingB2A = gLutBidi_##name##_B2A
+#define BIDI_LUT_MAP(from, to) \
+ lutMappingA2B[from] = to; \
+ lutMappingB2A[to] = from
+#define BIDI_LUT_INIT(name) InitializeLutBidi##name()
+#define BIDI_LUT_A2B_LOOKUP(name, from) (name##BType)(gLutBidi_##name##_A2B[from])
+#define BIDI_LUT_B2A_LOOKUP(name, to) (name##AType)(gLutBidi_##name##_B2A[to])
+
+// Forward string lookup
+#define FSTR_LUT_DECL(name, enumMinValue, enumMaxValue) \
+ constexpr int kLutFwMinVal_##name = enumMinValue; \
+ const char* gLutFw_##name[(int)enumMaxValue - (int)enumMinValue]; \
+ void InitializeLutFw##name()
+#define FSTR_LUT_MAP_FOR(name) \
+ const char** lutMapping = gLutFw_##name; \
+ int lutMappingMinValue = kLutFwMinVal_##name
+#define FSTR_LUT_MAP(value, text) lutMapping[value - lutMappingMinValue] = text
+#define FSTR_LUT_MAP_ENUM(enumValue) FSTR_LUT_MAP(enumValue, #enumValue)
+#define FSTR_LUT_LOOKUP(name, enumValue) gLutFw_##name[enumValue - kLutFwMinVal_##name]
+#define FSTR_LUT_INIT(name) InitializeLutFw##name()
+
+// RSTR stands for reverse-string lookup
+#define RSTR_LUT_DECL(name, enumMinValue, enumMaxValue) \
+ robin_hood::unordered_flat_map<std::string_view, decltype(enumMaxValue)> gLutRv_##name; \
+ void InitializeLutRv##name()
+#define RSTR_LUT_MAP_FOR(name) auto& lutMapping = gLutRv_##name;
+#define RSTR_LUT_MAP(value, text) lutMapping.insert_or_assign(std::string_view(text), value);
+#define RSTR_LUT(name) gLutRv_##name
+#define BSTR_LUT_LOOKUP(name, string) gLutRv_##name.find(std::string_view(text))->second
+#define RSTR_LUT_INIT(name) InitializeLutRv##name()
+
+// BSTR stands for bi-directional string lookup
+#define BSTR_LUT_DECL(name, enumMinValue, enumMaxValue) \
+ constexpr int kLutBstrMinVal_##name = enumMinValue; \
+ const char* gLutBstr_##name##_V2S[(int)enumMaxValue - (int)enumMinValue]; \
+ robin_hood::unordered_flat_map<std::string_view, decltype(enumMaxValue)> gLutBstr_##name##_S2V; \
+ void InitializeLutBstr##name()
+#define BSTR_LUT_MAP_FOR(name) \
+ const char** lutMappingV2S = gLutBstr_##name##_V2S; \
+ auto& lutMappingS2V = gLutBstr_##name##_S2V; \
+ int lutMappingMinValue = kLutBstrMinVal_##name
+#define BSTR_LUT_MAP(value, text) \
+ lutMappingV2S[value - lutMappingMinValue] = text; \
+ lutMappingS2V.insert_or_assign(std::string_view(text), value);
+#define BSTR_LUT_MAP_ENUM(enumValue) BSTR_LUT_MAP(enumValue, #enumValue)
+#define BSTR_LUT_V2S(name) gLutBstr_##name##_V2S
+#define BSTR_LUT_S2V(name) gLutBstr_##name##_S2V
+#define BSTR_LUT_V2S_LOOKUP(name, enumValue) gLutBstr_##name##_V2S[enumValue - kLutBstrMinVal_##name]
+#define BSTR_LUT_S2V_LOOKUP(name, string) gLutBstr_##name##_S2V.find(std::string_view(text))->second
+#define BSTR_LUT_INIT(name) InitializeLutBstr##name()