summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjalitriver <44458290+jalitriver@users.noreply.github.com>2023-01-07 12:33:11 -0600
committerGitHub <noreply@github.com>2023-01-07 10:33:11 -0800
commit920f3827a03e050cc686ed5387d541b1d336bd4f (patch)
treea70257b1e8986eb9ec3bd2ac5f7f190d93bca382 /src
parent81724e5b2030a6f9f4d38893a4aeb4ad5e1f7fc8 (diff)
downloadflatbuffers-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.cpp5
-rw-r--r--src/idl_gen_cpp.cpp4
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}}\\";