diff options
author | jalitriver <44458290+jalitriver@users.noreply.github.com> | 2023-01-07 12:33:11 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-07 10:33:11 -0800 |
commit | 920f3827a03e050cc686ed5387d541b1d336bd4f (patch) | |
tree | a70257b1e8986eb9ec3bd2ac5f7f190d93bca382 /src | |
parent | 81724e5b2030a6f9f4d38893a4aeb4ad5e1f7fc8 (diff) | |
download | flatbuffers-920f3827a03e050cc686ed5387d541b1d336bd4f.tar.gz flatbuffers-920f3827a03e050cc686ed5387d541b1d336bd4f.tar.bz2 flatbuffers-920f3827a03e050cc686ed5387d541b1d336bd4f.zip |
[C++] Add Command-Line Flag to Suppress MIN and MAX Enums (#7705)
Add the --no-minmax-values flag to prevent flatc from generating C++
enums with MIN and MAX enumerated values that otherwise would be set
to the inclusive lower and upper bound respectively of the enum.
This command-line flag is needed to avoid collisions when an enum that
is being ported to FlatBuffers already has a MIN or MAX enumerated
value.
It is also needed to work around a long-standing problem with
magic_enum that causes magic_enum to not see enumerated values that
are not unique. For example, if FlatBuffers sets MIN = FOO and MAX =
BAR, MIN and FOO share the same underlying value so they are not
unique. The same is true of MAX and BAR. This prevents magic_enum
from converting FOO and BAR to and from strings as well as causing
magic_enum to return a count of enumerated values that is two fewer
than it should be.
Co-authored-by: Paul Serice <paul@serice.net>
Diffstat (limited to 'src')
-rw-r--r-- | src/flatc.cpp | 5 | ||||
-rw-r--r-- | src/idl_gen_cpp.cpp | 4 |
2 files changed, 8 insertions, 1 deletions
diff --git a/src/flatc.cpp b/src/flatc.cpp index 998d77b8..02119dd6 100644 --- a/src/flatc.cpp +++ b/src/flatc.cpp @@ -88,6 +88,9 @@ const static FlatCOption options[] = { { "", "scoped-enums", "", "Use C++11 style scoped and strongly typed enums. Also implies " "--no-prefix." }, + { "", "no-emit-min-max-enum-values", "", + "Disable generation of MIN and MAX enumerated values for scoped enums " + "and prefixed enums." }, { "", "swift-implementation-only", "", "Adds a @_implementationOnly to swift imports" }, { "", "gen-includes", "", @@ -464,6 +467,8 @@ int FlatCompiler::Compile(int argc, const char **argv) { } else if (arg == "--scoped-enums") { opts.prefixed_enums = false; opts.scoped_enums = true; + } else if (arg == "--no-emit-min-max-enum-values") { + opts.emit_min_max_enum_values = false; } else if (arg == "--no-union-value-namespacing") { opts.union_value_namespacing = false; } else if (arg == "--gen-mutable") { diff --git a/src/idl_gen_cpp.cpp b/src/idl_gen_cpp.cpp index 4f6236fb..80f2d42b 100644 --- a/src/idl_gen_cpp.cpp +++ b/src/idl_gen_cpp.cpp @@ -1223,6 +1223,8 @@ class CppGenerator : public BaseGenerator { FLATBUFFERS_ASSERT(minv && maxv); code_.SetValue("SEP", ",\n"); + + // MIN & MAX are useless for bit_flags if (enum_def.attributes.Lookup("bit_flags")) { code_.SetValue("KEY", GenEnumValDecl(enum_def, "NONE")); code_.SetValue("VALUE", "0"); @@ -1233,7 +1235,7 @@ class CppGenerator : public BaseGenerator { NumToStringCpp(enum_def.AllFlags(), enum_def.underlying_type.base_type)); code_ += "{{SEP}} {{KEY}} = {{VALUE}}\\"; - } else { // MIN & MAX are useless for bit_flags + } else if (opts_.emit_min_max_enum_values) { code_.SetValue("KEY", GenEnumValDecl(enum_def, "MIN")); code_.SetValue("VALUE", GenEnumValDecl(enum_def, Name(*minv))); code_ += "{{SEP}} {{KEY}} = {{VALUE}}\\"; |