From 3fc5387db79612981b41b86cd89f315269d54f3f Mon Sep 17 00:00:00 2001 From: Wouter van Oortmerssen Date: Mon, 30 Nov 2015 13:54:24 -0800 Subject: [PATCH] Made C++ generated code use "bool" instead of uint8_t wire type. Change-Id: I5756d15a758429ca67456264842017063d1f755e Tested: on Linux. --- src/idl_gen_cpp.cpp | 34 +++++++++++++++++++++------------- tests/monster_test_generated.h | 8 ++++---- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/idl_gen_cpp.cpp b/src/idl_gen_cpp.cpp index 6411038..7c39c32 100644 --- a/src/idl_gen_cpp.cpp +++ b/src/idl_gen_cpp.cpp @@ -59,20 +59,22 @@ static std::string TranslateNameSpace(const std::string &qualified_name) { // Return a C++ type from the table in idl.h static std::string GenTypeBasic(const Parser &parser, const Type &type, - bool real_enum) { + bool user_facing_type) { static const char *ctypename[] = { #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, JTYPE, GTYPE, NTYPE, PTYPE) \ #CTYPE, FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD) #undef FLATBUFFERS_TD }; - return real_enum && type.enum_def - ? WrapInNameSpace(parser, *type.enum_def) - : ctypename[type.base_type]; + if (user_facing_type) { + if (type.enum_def) return WrapInNameSpace(parser, *type.enum_def); + if (type.base_type == BASE_TYPE_BOOL) return "bool"; + } + return ctypename[type.base_type]; } static std::string GenTypeWire(const Parser &parser, const Type &type, - const char *postfix, bool real_enum); + const char *postfix, bool user_facing_type); // Return a C++ pointer type, specialized to the actual struct/table types, // and vector element types. @@ -96,9 +98,9 @@ static std::string GenTypePointer(const Parser &parser, const Type &type) { // Return a C++ type for any type (scalar/pointer) specifically for // building a flatbuffer. static std::string GenTypeWire(const Parser &parser, const Type &type, - const char *postfix, bool real_enum) { + const char *postfix, bool user_facing_type) { return IsScalar(type.base_type) - ? GenTypeBasic(parser, type, real_enum) + postfix + ? GenTypeBasic(parser, type, user_facing_type) + postfix : IsStruct(type) ? "const " + GenTypePointer(parser, type) + " *" : "flatbuffers::Offset<" + GenTypePointer(parser, type) + ">" + postfix; @@ -118,9 +120,9 @@ static std::string GenTypeSize(const Parser &parser, const Type &type) { // using a flatbuffer. static std::string GenTypeGet(const Parser &parser, const Type &type, const char *afterbasic, const char *beforeptr, - const char *afterptr, bool real_enum) { + const char *afterptr, bool user_facing_type) { return IsScalar(type.base_type) - ? GenTypeBasic(parser, type, real_enum) + afterbasic + ? GenTypeBasic(parser, type, user_facing_type) + afterbasic : beforeptr + GenTypePointer(parser, type) + afterptr; } @@ -190,9 +192,12 @@ static void GenEnum(const Parser &parser, EnumDef &enum_def, } code += "nullptr };\n return names;\n}\n\n"; code += "inline const char *EnumName" + enum_def.name; - code += "(" + enum_def.name + " e) { return EnumNames" + enum_def.name + "()[static_cast(e)"; - if (enum_def.vals.vec.front()->value) - code += " - static_cast(" + GetEnumVal(enum_def, *enum_def.vals.vec.front(), opts) +")"; + code += "(" + enum_def.name + " e) { return EnumNames" + enum_def.name; + code += "()[static_cast(e)"; + if (enum_def.vals.vec.front()->value) { + code += " - static_cast("; + code += GetEnumVal(enum_def, *enum_def.vals.vec.front(), opts) +")"; + } code += "]; }\n\n"; } @@ -230,7 +235,8 @@ static void GenEnum(const Parser &parser, EnumDef &enum_def, // underlying type to the interface type. std::string GenUnderlyingCast(const Parser &parser, const FieldDef &field, bool from, const std::string &val) { - return field.value.type.enum_def && IsScalar(field.value.type.base_type) + return (field.value.type.enum_def && IsScalar(field.value.type.base_type)) || + field.value.type.base_type == BASE_TYPE_BOOL ? "static_cast<" + GenTypeBasic(parser, field.value.type, from) + ">(" + val + ")" : val; @@ -456,6 +462,8 @@ static void GenTable(const Parser &parser, StructDef &struct_def, } else { code += GenUnderlyingCast(parser, field, true, field.value.constant); } + } else if (field.value.type.base_type == BASE_TYPE_BOOL) { + code += field.value.constant == "0" ? "false" : "true"; } else { code += field.value.constant; } diff --git a/tests/monster_test_generated.h b/tests/monster_test_generated.h index 9ef7659..8a78de5 100644 --- a/tests/monster_test_generated.h +++ b/tests/monster_test_generated.h @@ -202,8 +202,8 @@ struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { const MyGame::Example::Monster *testnestedflatbuffer_nested_root() const { return flatbuffers::GetRoot(testnestedflatbuffer()->Data()); } const Stat *testempty() const { return GetPointer(32); } Stat *mutable_testempty() { return GetPointer(32); } - uint8_t testbool() const { return GetField(34, 0); } - bool mutate_testbool(uint8_t _testbool) { return SetField(34, _testbool); } + bool testbool() const { return static_cast(GetField(34, 0)); } + bool mutate_testbool(bool _testbool) { return SetField(34, static_cast(_testbool)); } int32_t testhashs32_fnv1() const { return GetField(36, 0); } bool mutate_testhashs32_fnv1(int32_t _testhashs32_fnv1) { return SetField(36, _testhashs32_fnv1); } uint32_t testhashu32_fnv1() const { return GetField(38, 0); } @@ -281,7 +281,7 @@ struct MonsterBuilder { void add_enemy(flatbuffers::Offset enemy) { fbb_.AddOffset(28, enemy); } void add_testnestedflatbuffer(flatbuffers::Offset> testnestedflatbuffer) { fbb_.AddOffset(30, testnestedflatbuffer); } void add_testempty(flatbuffers::Offset testempty) { fbb_.AddOffset(32, testempty); } - void add_testbool(uint8_t testbool) { fbb_.AddElement(34, testbool, 0); } + void add_testbool(bool testbool) { fbb_.AddElement(34, static_cast(testbool), 0); } void add_testhashs32_fnv1(int32_t testhashs32_fnv1) { fbb_.AddElement(36, testhashs32_fnv1, 0); } void add_testhashu32_fnv1(uint32_t testhashu32_fnv1) { fbb_.AddElement(38, testhashu32_fnv1, 0); } void add_testhashs64_fnv1(int64_t testhashs64_fnv1) { fbb_.AddElement(40, testhashs64_fnv1, 0); } @@ -315,7 +315,7 @@ inline flatbuffers::Offset CreateMonster(flatbuffers::FlatBufferBuilder flatbuffers::Offset enemy = 0, flatbuffers::Offset> testnestedflatbuffer = 0, flatbuffers::Offset testempty = 0, - uint8_t testbool = 0, + bool testbool = false, int32_t testhashs32_fnv1 = 0, uint32_t testhashu32_fnv1 = 0, int64_t testhashs64_fnv1 = 0, -- 2.7.4