commit d87d88faafd709ca4f4d772e47fc9477ba483c04 Author: Reece Date: Thu Oct 28 21:35:48 2021 +0100 [+] Initial Commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b4bba34 --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +Build_CompilerWorkingDirectory/* +Build_Developers/* +Build_Ship/* +Build_Internal/* +Build_Develop/* +Build_Stage/* +Build_Ship/* +Build_Workspace/* +*.vcxproj +*.vcxproj.filters +*.vcxproj.user +*.licenseheader +*.dll +*.exe +*.obj +*.so +*.dynlib +*.lib +*.d +*.o +*.a +*.la +*.out +.vs +compile_flags.txt +*.mk +*.project +*cmake +.intellij +.clion +Makefile diff --git a/Aurora.json b/Aurora.json new file mode 100644 index 0000000..3f8fb95 --- /dev/null +++ b/Aurora.json @@ -0,0 +1,6 @@ +{ + "name":" AuroraEnum", + "type": "generic", + "include": "Include", + "noLink": true +} \ No newline at end of file diff --git a/Include/AuroraEnum.hpp b/Include/AuroraEnum.hpp new file mode 100644 index 0000000..aacc336 --- /dev/null +++ b/Include/AuroraEnum.hpp @@ -0,0 +1,51 @@ +/*** + Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. + + File: AuroraEnum.hpp + Date: 2021-10-28 + Author: Reece +***/ +#pragma once + +/////////////////////////////////////////////////////////////////////////////////////////// +/// Utilities +/////////////////////////////////////////////////////////////////////////////////////////// + +/// @hideinitializer +#define AUE_BRACKET_SCOPE(...) __VA_ARGS__ + +/// @hideinitializer +#define AUE_STRIP_BRACKETS_(X) X + +/// @hideinitializer +#define AUE_STRIP_BRACKETS(X) AUE_STRIP_BRACKETS_(AUE_BRACKET_SCOPE X) + +/// @hideinitializer +#define AUE_EMIT_ARRAY(val) val, + +/// @hideinitializer +#define AUE_EMIT_A(val) #val + +/// @hideinitializer +#define AUE_EMIT_B(val) , #val + +/// @hideinitializer +#define AUE_EMIT_PAIRNAME(name, val) {#val, name::val}, + +/// @hideinitializer +#define AUE_EMIT_CALL(name, val) consumer(name::val); + +/// @hideinitializer +#define AUE_EMIT_CHECK(name, val) if (codename == #val) {return name::val;} + +/////////////////////////////////////////////////////////////////////////////////////////// +// API +/////////////////////////////////////////////////////////////////////////////////////////// + +#define AUE_DEFINE(name, vals) enum class name { AU_FOR_EACH(AUE_EMIT_ARRAY, AUE_STRIP_BRACKETS(vals)) kEnumCount }; \ + static inline const AuString k ## name ## ToString[static_cast(name::kEnumCount)] = {AU_FOR_EACH_FIRST(AUE_EMIT_A, AUE_EMIT_B, AUE_STRIP_BRACKETS(vals)) }; \ + inline const AuHashMap kName ## FromString = { AU_FOR_EACH_THAT(AUE_EMIT_PAIRNAME, name, AUE_STRIP_BRACKETS(vals)) {"kEnumCount", name::kEnumCount} }; \ + static inline name name ## FromString (const AuString &codename) { AU_FOR_EACH_THAT(AUE_EMIT_CHECK, name, AUE_STRIP_BRACKETS(vals)) return name::kEnumCount; } \ + static inline name name ## FromHashString(const AuString &codename) { const name *val; if (!AuTryFind(kName ## FromString, codename, val)) return name::kEnumCount; return *val; } \ + static inline const AuString & name ## ToString(name val) { static const AuString invalid = "kEnumCount"; if (static_cast(val) >= static_cast(name::kEnumCount)) return invalid; return k ## name ## ToString[static_cast(val)]; } \ + static inline void name ## ForEach(const AuConsumer &consumer) { AU_FOR_EACH_THAT(AUE_EMIT_CALL, name, AUE_STRIP_BRACKETS(vals)) } \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..d96c442 --- /dev/null +++ b/README.md @@ -0,0 +1,40 @@ +## Aurora Enum + +[TODO] + +## Example + +```c++ +#define AUE_DEFINE(name, enumerations) + +AUE_DEFINE(EMyTestEnum, ( + eValueA, + eValueB, + eValueC, + eValueD +)); + +static void TestAUE() +{ + EMyTestEnum referenceValue = EMyTestEnum::eValueB; + + // Convert the index to a string safely O(1) + const AuString &string = EMyTestEnumToString(referenceValue); + + // Lookup O(n) + EMyTestEnum backAgain = EMyTestEnumFromString(string); + + // Lookup using a hash table + EMyTestEnum fromHashTable = EMyTestEnumFromHashString(string); + + // Assert + SysAssert(backAgain == referenceValue); + SysAssert(fromHashTable == referenceValue); + + // And iteration for fun + EMyTestEnumForEach([](EMyTestEnum e) + { + LogDbg(EMyTestEnumToString(e)); + }); +} +``` \ No newline at end of file