summaryrefslogtreecommitdiffstats
path: root/src/BlockID.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/BlockID.h')
-rw-r--r--src/BlockID.h28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/BlockID.h b/src/BlockID.h
index 8ce7a040b..bd24f9312 100644
--- a/src/BlockID.h
+++ b/src/BlockID.h
@@ -1212,3 +1212,31 @@ extern cItem GetIniItemSet(cIniFile & a_IniFile, const char * a_Section, const c
+/** Base case for IsOneOf to handle empty template aguments. */
+template <class = void>
+bool IsOneOf(BLOCKTYPE a_BlockType)
+{
+ return false;
+}
+
+
+/** Returns true if a_BlockType is equal to any of the variadic template arguments.
+Some example usage:
+\code
+ IsOneOf<>(E_BLOCK_AIR) == false
+ IsOneOf<E_BLOCK_AIR>(E_BLOCK_DIRT) == false
+ IsOneOf<E_BLOCK_AIR, E_BLOCK_DIRT>(E_BLOCK_DIRT) == true
+\endcode
+The implementation is ugly but it is equivalent to this C++17 fold expression:
+\code
+ ((a_BlockType == Types) || ...)
+\endcode
+Just written to be valid without fold expressions or SFINAE. */
+template <BLOCKTYPE Head, BLOCKTYPE ... Tail>
+bool IsOneOf(BLOCKTYPE a_BlockType)
+{
+ return ((a_BlockType == Head) || (IsOneOf<Tail...>(a_BlockType)));
+}
+
+
+