Commit dadd1a92 authored by rufeooo's avatar rufeooo Committed by Wouter van Oortmerssen

Generate a C++ function for EnumValues{{ENUM_NAME}} (#4337)

* enables "for each" logic on enumeration types
parent 01c50d57
...@@ -25,6 +25,15 @@ enum Color { ...@@ -25,6 +25,15 @@ enum Color {
Color_MAX = Color_Blue Color_MAX = Color_Blue
}; };
inline Color (&EnumValuesColor())[3] {
static Color values[] = {
Color_Red,
Color_Green,
Color_Blue
};
return values;
}
inline const char **EnumNamesColor() { inline const char **EnumNamesColor() {
static const char *names[] = { static const char *names[] = {
"Red", "Red",
...@@ -47,6 +56,14 @@ enum Equipment { ...@@ -47,6 +56,14 @@ enum Equipment {
Equipment_MAX = Equipment_Weapon Equipment_MAX = Equipment_Weapon
}; };
inline Equipment (&EnumValuesEquipment())[2] {
static Equipment values[] = {
Equipment_NONE,
Equipment_Weapon
};
return values;
}
inline const char **EnumNamesEquipment() { inline const char **EnumNamesEquipment() {
static const char *names[] = { static const char *names[] = {
"NONE", "NONE",
......
...@@ -553,7 +553,9 @@ class CppGenerator : public BaseGenerator { ...@@ -553,7 +553,9 @@ class CppGenerator : public BaseGenerator {
(inclass ? " = nullptr" : "") + ") const"; (inclass ? " = nullptr" : "") + ") const";
} }
// Generate an enum declaration and an enum string lookup table. // Generate an enum declaration,
// an enum string lookup table,
// and an enum array of values
void GenEnum(const EnumDef &enum_def) { void GenEnum(const EnumDef &enum_def) {
code_.SetValue("ENUM_NAME", enum_def.name); code_.SetValue("ENUM_NAME", enum_def.name);
code_.SetValue("BASE_TYPE", GenTypeBasic(enum_def.underlying_type, false)); code_.SetValue("BASE_TYPE", GenTypeBasic(enum_def.underlying_type, false));
...@@ -612,6 +614,22 @@ class CppGenerator : public BaseGenerator { ...@@ -612,6 +614,22 @@ class CppGenerator : public BaseGenerator {
} }
code_ += ""; code_ += "";
// Generate an array of all enumeration values
auto num_fields = NumToString(enum_def.vals.vec.size());
code_ += "inline {{ENUM_NAME}} (&EnumValues{{ENUM_NAME}}())[" + num_fields + "] {";
code_ += " static {{ENUM_NAME}} values[] = {";
for (auto it = enum_def.vals.vec.begin(); it != enum_def.vals.vec.end();
++it) {
const auto &ev = **it;
auto value = GetEnumValUse(enum_def, ev);
auto suffix = *it != enum_def.vals.vec.back() ? "," : "";
code_ += " " + value + suffix;
}
code_ += " };";
code_ += " return values;";
code_ += "}";
code_ += "";
// Generate a generate string table for enum values. // Generate a generate string table for enum values.
// Problem is, if values are very sparse that could generate really big // Problem is, if values are very sparse that could generate really big
// tables. Ideally in that case we generate a map lookup instead, but for // tables. Ideally in that case we generate a map lookup instead, but for
......
No preview for this file type
...@@ -39,6 +39,15 @@ enum Color { ...@@ -39,6 +39,15 @@ enum Color {
Color_ANY = 11 Color_ANY = 11
}; };
inline Color (&EnumValuesColor())[3] {
static Color values[] = {
Color_Red,
Color_Green,
Color_Blue
};
return values;
}
inline const char **EnumNamesColor() { inline const char **EnumNamesColor() {
static const char *names[] = { static const char *names[] = {
"Red", "Red",
...@@ -68,6 +77,16 @@ enum Any { ...@@ -68,6 +77,16 @@ enum Any {
Any_MAX = Any_MyGame_Example2_Monster Any_MAX = Any_MyGame_Example2_Monster
}; };
inline Any (&EnumValuesAny())[4] {
static Any values[] = {
Any_NONE,
Any_Monster,
Any_TestSimpleTableWithEnum,
Any_MyGame_Example2_Monster
};
return values;
}
inline const char **EnumNamesAny() { inline const char **EnumNamesAny() {
static const char *names[] = { static const char *names[] = {
"NONE", "NONE",
......
...@@ -21,6 +21,15 @@ enum EnumInNestedNS { ...@@ -21,6 +21,15 @@ enum EnumInNestedNS {
EnumInNestedNS_MAX = EnumInNestedNS_C EnumInNestedNS_MAX = EnumInNestedNS_C
}; };
inline EnumInNestedNS (&EnumValuesEnumInNestedNS())[3] {
static EnumInNestedNS values[] = {
EnumInNestedNS_A,
EnumInNestedNS_B,
EnumInNestedNS_C
};
return values;
}
inline const char **EnumNamesEnumInNestedNS() { inline const char **EnumNamesEnumInNestedNS() {
static const char *names[] = { static const char *names[] = {
"A", "A",
......
...@@ -28,6 +28,19 @@ enum Character { ...@@ -28,6 +28,19 @@ enum Character {
Character_MAX = Character_Unused Character_MAX = Character_Unused
}; };
inline Character (&EnumValuesCharacter())[7] {
static Character values[] = {
Character_NONE,
Character_MuLan,
Character_Rapunzel,
Character_Belle,
Character_BookFan,
Character_Other,
Character_Unused
};
return values;
}
inline const char **EnumNamesCharacter() { inline const char **EnumNamesCharacter() {
static const char *names[] = { static const char *names[] = {
"NONE", "NONE",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment