diff --git a/include/flatbuffers/flatbuffers.h b/include/flatbuffers/flatbuffers.h index 0fa31250f..9a8e0bef7 100644 --- a/include/flatbuffers/flatbuffers.h +++ b/include/flatbuffers/flatbuffers.h @@ -1485,6 +1485,35 @@ volatile __attribute__((weak)) const char *flatbuffer_version_string = #endif // !defined(_WIN32) && !defined(__CYGWIN__) +#define DEFINE_BITMASK_OPERATORS(E)\ + inline E operator | (E lhs, E rhs){\ + using T = std::underlying_type::type;\ + return E(T(lhs) | T(rhs));\ + }\ + inline E operator & (E lhs, E rhs){\ + using T = std::underlying_type::type;\ + return E(T(lhs) & T(rhs));\ + }\ + inline E operator ^ (E lhs, E rhs){\ + using T = std::underlying_type::type;\ + return E(T(lhs) ^ T(rhs));\ + }\ + inline E operator ~ (E lhs){\ + using T = std::underlying_type::type;\ + return E(~T(lhs));\ + }\ + inline E operator |= (E &lhs, E rhs){\ + lhs = lhs | rhs;\ + return lhs;\ + }\ + inline E operator &= (E &lhs, E rhs){\ + lhs = lhs & rhs;\ + return lhs;\ + }\ + inline E operator ^= (E &lhs, E rhs){\ + lhs = lhs ^ rhs;\ + return lhs;\ + } /// @endcond } // namespace flatbuffers diff --git a/src/idl_gen_cpp.cpp b/src/idl_gen_cpp.cpp index 051cd99de..f0daca26a 100644 --- a/src/idl_gen_cpp.cpp +++ b/src/idl_gen_cpp.cpp @@ -182,7 +182,10 @@ static void GenEnum(const Parser &parser, EnumDef &enum_def, 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"; + code += "};\n"; + if (parser.opts.scoped_enums && enum_def.attributes.Lookup("bit_flags")) + code += "DEFINE_BITMASK_OPERATORS(" + enum_def.name + ")\n"; + code += "\n"; // Generate a generate string table for enum values. // Problem is, if values are very sparse that could generate really big