mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2024-11-26 23:47:21 +00:00
56 lines
2.1 KiB
C++
56 lines
2.1 KiB
C++
// 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 "<none>"
|
|
|
|
#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<std::size_t>(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<TYPE, const char*> 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<TYPE>(value));\
|
|
if (it != sv.end())\
|
|
return it->second;\
|
|
return NO_VALUE;\
|
|
}
|
|
|
|
#endif
|