// Source - https://mariusbancila.ro/blog/2023/08/17/how-to-convert-an-enum-to-string-in-cpp/ #pragma once #undef DECL_ENUM_ELEMENT #undef BEGIN_ENUM #undef END_ENUM #ifndef GENERATE_ENUM_STRINGS #define DECLARE_ENUM_ELEMENT(element) element, #define BEGIN_ENUM(ENUM_NAME, TYPE) typedef enum class tag##ENUM_NAME : TYPE { #define BEGIN_ENUM_INT(ENUM_NAME) BEGIN_ENUM(ENUM_NAME, int) #define END_ENUM(ENUM_NAME) } ENUM_NAME; const char* ENUM_NAME##_as_string(enum tag##ENUM_NAME index); #define DECLARE_ENUM_ELEMENT_WITH_VALUE(element, value) element = value, #define BEGIN_ENUM_WITH_VALUES(ENUM_NAME, TYPE) BEGIN_ENUM(ENUM_NAME, TYPE) #define BEGIN_ENUM_WITH_VALUES_INT(ENUM_NAME) BEGIN_ENUM(ENUM_NAME, int) #define END_ENUM_WITH_VALUES(ENUM_NAME, TYPE) END_ENUM(ENUM_NAME) #else #define NO_VALUE "" #define DECLARE_ENUM_ELEMENT(element) #element, #define BEGIN_ENUM(ENUM_NAME, TYPE) enum class tag##ENUM_NAME : TYPE;\ const char* ENUM_NAME##_as_string(enum tag##ENUM_NAME value) {\ std::size_t index = static_cast(value);\ static const char* s_##ENUM_NAME[] = { #define BEGIN_ENUM_INT(ENUM_NAME) BEGIN_ENUM(ENUM_NAME, int) #define END_ENUM(ENUM_NAME) };\ static const std::size_t s_##ENUM_NAME_len = sizeof(s_##ENUM_NAME)/sizeof(const char*);\ if(index >=0 && index < s_##ENUM_NAME_len)\ return s_##ENUM_NAME[index]; \ return NO_VALUE;\ } #define DECLARE_ENUM_ELEMENT_WITH_VALUE(element, value) {value, #element}, #define BEGIN_ENUM_WITH_VALUES(ENUM_NAME, TYPE) enum class tag##ENUM_NAME : TYPE;\ const char* ENUM_NAME##_as_string(enum tag##ENUM_NAME value) {\ std::map sv = { #define BEGIN_ENUM_WITH_VALUES_INT(ENUM_NAME) BEGIN_ENUM_WITH_VALUES(ENUM_NAME, int) #define END_ENUM_WITH_VALUES(ENUM_NAME, TYPE) };\ auto it = sv.find(static_cast(value));\ if (it != sv.end())\ return it->second;\ return NO_VALUE;\ } #endif