Last active
December 15, 2022 06:02
-
-
Save dsaltares/8904478 to your computer and use it in GitHub Desktop.
Smart enums using high order macros in C++
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#ifndef __SMARTENUM_H__ | |
#define __SMARTENUM_H__ | |
#include <cstring> | |
#define SMARTENUM_VALUE(typeName, value) e##typeName##_##value, | |
#define SMARTENUM_STRING(typeName, value) #value, | |
#define SMARTENUM_DEFINE_ENUM(typeName, values) enum typeName { values(SMARTENUM_VALUE) e##typeName##_Count, }; | |
#define SMARTENUM_DEFINE_NAMES(typeName, values) const char* typeName##Array [] = { values(SMARTENUM_STRING) }; | |
#define SMARTENUM_DEFINE_GET_VALUE_FROM_STRING(typeName, name) \ | |
typeName get##typeName##FromString(const char* str) \ | |
{ \ | |
for (int i = 0; i < e##typeName##_Count; ++i) \ | |
if (!strcmp(##typeName##Array[i], str)) \ | |
return (##typeName##)i; \ | |
return e##typeName##_Count; \ | |
} | |
#define getStringFromEnumValue(typeName, value) typeName##Array[##value] | |
#define getEnumValueFromString(typeName, name) get##typeName##FromString(##name) | |
#endif // __SMARTENUM_H__ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thank you for sharing this code. Could you help me, I tried to compile this code but I have an error. The error is .
#include
#include
#include
#define SMARTENUM_VALUE(typeName, value) e##typeName##_##value,
#define SMARTENUM_STRING(typeName, value) #value,
#define SMARTENUM_DEFINE_ENUM(typeName, values) enum typeName { values(SMARTENUM_VALUE) e##typeName##_Count };
#define SMARTENUM_DEFINE_NAMES(typeName, values) const char* typeName##Array [] = { values(SMARTENUM_STRING) };
#define SMARTENUM_DEFINE_GET_VALUE_FROM_STRING(typeName, name)
typeName get##typeName##FromString(const char* str)
{
for (int i = 0; i < e##typeName##_Count; ++i) {
if (!strcmp(##typeName##Array[i], str)) {
return (##typeName##)i; }
return e##typeName##_Count; }
}
#define getStringFromEnumValue(typeName, value) typeName##Array[##value]
#define getEnumValueFromString(typeName, name) get##typeName##FromString(##name)
#define ANIMAL_LIST(m)
m(Animal, Dog)
m(Animal, Cat)
m(Animal, Cow)
#define CAR_LIST(m)
m(Car, Fiat)
m(Car, Ford)
m(Car, Audi)
int main()
{
}