diff --git a/samples/monster_generated.h b/samples/monster_generated.h index 53935ee93..adc8e9b19 100644 --- a/samples/monster_generated.h +++ b/samples/monster_generated.h @@ -15,7 +15,9 @@ struct Monster; enum Color { Color_Red = 0, Color_Green = 1, - Color_Blue = 2 + Color_Blue = 2, + Color_MIN = Color_Red, + Color_MAX = Color_Blue }; inline const char **EnumNamesColor() { @@ -27,7 +29,9 @@ inline const char *EnumNameColor(Color e) { return EnumNamesColor()[static_cast< enum Any { Any_NONE = 0, - Any_Monster = 1 + Any_Monster = 1, + Any_MIN = Any_NONE, + Any_MAX = Any_Monster }; inline const char **EnumNamesAny() { diff --git a/src/idl_gen_cpp.cpp b/src/idl_gen_cpp.cpp index fa2708000..fb34b97e3 100644 --- a/src/idl_gen_cpp.cpp +++ b/src/idl_gen_cpp.cpp @@ -131,10 +131,10 @@ static std::string GenEnumDecl(const EnumDef &enum_def, return (opts.scoped_enums ? "enum class " : "enum ") + enum_def.name; } -static std::string GenEnumVal(const EnumDef &enum_def, const EnumVal &enum_val, +static std::string GenEnumVal(const EnumDef &enum_def, + const std::string &enum_val, const IDLOptions &opts) { - return opts.prefixed_enums ? enum_def.name + "_" + enum_val.name - : enum_val.name; + return opts.prefixed_enums ? enum_def.name + "_" + enum_val : enum_val; } static std::string GetEnumVal(const EnumDef &enum_def, const EnumVal &enum_val, @@ -159,15 +159,22 @@ static void GenEnum(const Parser &parser, EnumDef &enum_def, if (parser.opts.scoped_enums) code += " : " + GenTypeBasic(parser, enum_def.underlying_type, false); code += " {\n"; + EnumVal *minv = nullptr, *maxv = nullptr; for (auto it = enum_def.vals.vec.begin(); it != enum_def.vals.vec.end(); ++it) { auto &ev = **it; GenComment(ev.doc_comment, code_ptr, nullptr, " "); - code += " " + GenEnumVal(enum_def, ev, parser.opts) + " = "; - code += NumToString(ev.value); - code += (it + 1) != enum_def.vals.vec.end() ? ",\n" : "\n"; + code += " " + GenEnumVal(enum_def, ev.name, parser.opts) + " = "; + code += NumToString(ev.value) + ",\n"; + minv = !minv || minv->value > ev.value ? &ev : minv; + maxv = !maxv || maxv->value < ev.value ? &ev : maxv; } + assert(minv && maxv); + code += " " + GenEnumVal(enum_def, "MIN", parser.opts) + " = "; + code += GenEnumVal(enum_def, minv->name, parser.opts) + ",\n"; + code += " " + GenEnumVal(enum_def, "MAX", parser.opts) + " = "; + code += GenEnumVal(enum_def, maxv->name, parser.opts) + "\n"; code += "};\n\n"; // Generate a generate string table for enum values. diff --git a/tests/monster_test_generated.h b/tests/monster_test_generated.h index 14780bf2d..1ace5f082 100644 --- a/tests/monster_test_generated.h +++ b/tests/monster_test_generated.h @@ -23,7 +23,9 @@ struct Monster; enum Color { Color_Red = 1, Color_Green = 2, - Color_Blue = 8 + Color_Blue = 8, + Color_MIN = Color_Red, + Color_MAX = Color_Blue }; inline const char **EnumNamesColor() { @@ -36,7 +38,9 @@ inline const char *EnumNameColor(Color e) { return EnumNamesColor()[static_cast< enum Any { Any_NONE = 0, Any_Monster = 1, - Any_TestSimpleTableWithEnum = 2 + Any_TestSimpleTableWithEnum = 2, + Any_MIN = Any_NONE, + Any_MAX = Any_TestSimpleTableWithEnum }; inline const char **EnumNamesAny() { diff --git a/tests/namespace_test/NamespaceA/TableInFirstNS.php b/tests/namespace_test/NamespaceA/TableInFirstNS.php index 09a2c550b..57a827bc5 100644 --- a/tests/namespace_test/NamespaceA/TableInFirstNS.php +++ b/tests/namespace_test/NamespaceA/TableInFirstNS.php @@ -36,7 +36,7 @@ class TableInFirstNS extends Table { $obj = new TableInNestedNS(); $o = $this->__offset(4); - return $o != 0 ? $obj->init($o + $this->bb_pos, $this->bb) : 0; + return $o != 0 ? $obj->init($this->__indirect($o + $this->bb_pos), $this->bb) : 0; } /** diff --git a/tests/namespace_test/namespace_test1_generated.h b/tests/namespace_test/namespace_test1_generated.h index 29f8e1229..e7a109c6f 100644 --- a/tests/namespace_test/namespace_test1_generated.h +++ b/tests/namespace_test/namespace_test1_generated.h @@ -15,7 +15,9 @@ struct StructInNestedNS; enum EnumInNestedNS { EnumInNestedNS_A = 0, EnumInNestedNS_B = 1, - EnumInNestedNS_C = 2 + EnumInNestedNS_C = 2, + EnumInNestedNS_MIN_VAL = EnumInNestedNS_A, + EnumInNestedNS_MAX_VAL = EnumInNestedNS_C }; inline const char **EnumNamesEnumInNestedNS() {