From df0991b7ded0533554d3665e782273b6c8736376 Mon Sep 17 00:00:00 2001 From: Xun Liu <xun@pinterest.com> Date: Wed, 14 Sep 2016 10:33:06 -0700 Subject: [PATCH] serialize fully qualified struct & enum name in schema binary --- src/idl_parser.cpp | 9 ++++++--- tests/monster_test.bfbs | Bin 3152 -> 3384 bytes tests/test.cpp | 10 +++++++++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/idl_parser.cpp b/src/idl_parser.cpp index d845b837..6a5808db 100644 --- a/src/idl_parser.cpp +++ b/src/idl_parser.cpp @@ -1977,7 +1977,8 @@ std::set<std::string> Parser::GetIncludedFilesRecursive( // Schema serialization functionality: template<typename T> bool compareName(const T* a, const T* b) { - return a->name < b->name; + return a->defined_namespace->GetFullyQualifiedName(a->name) + < b->defined_namespace->GetFullyQualifiedName(b->name); } template<typename T> void AssignIndices(const std::vector<T *> &defvec) { @@ -2023,8 +2024,9 @@ Offset<reflection::Object> StructDef::Serialize(FlatBufferBuilder *builder, (*it)->Serialize(builder, static_cast<uint16_t>(it - fields.vec.begin()), parser)); } + auto qualified_name = defined_namespace->GetFullyQualifiedName(name); return reflection::CreateObject(*builder, - builder->CreateString(name), + builder->CreateString(qualified_name), builder->CreateVectorOfSortedTables( &field_offsets), fixed, @@ -2061,8 +2063,9 @@ Offset<reflection::Enum> EnumDef::Serialize(FlatBufferBuilder *builder, for (auto it = vals.vec.begin(); it != vals.vec.end(); ++it) { enumval_offsets.push_back((*it)->Serialize(builder)); } + auto qualified_name = defined_namespace->GetFullyQualifiedName(name); return reflection::CreateEnum(*builder, - builder->CreateString(name), + builder->CreateString(qualified_name), builder->CreateVector(enumval_offsets), is_union, underlying_type.Serialize(builder), diff --git a/tests/monster_test.bfbs b/tests/monster_test.bfbs index e131ac8c2ee97914bfc1c02ce683ac4f5ecb43d6..0369f896935ecf0822e50268c42f9fa4dfb9da87 100644 GIT binary patch literal 3384 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 literal 3152 zcmaJ@PiS0a5T8vp$!`8^(i+<}jS@>KMMTmx1d$wKY+41Af{8J=bd$VwSKhu|cHf4^ zlXxg1QaniT&_fSB6e;4N^b|@dB1NPG3F4^)Pab;c#b|5o^Y@$CZ}(Y(AIzKYd-I$5 zX6Bo3-WwK?=`+*wU>F(6N>WnND+4l!mEb8d3Yr9+1}(LTbb){0Bl0fhTPcww=6<)x zF8D%Pq#bhV3@3mCB{82pH>Z10Rw@U0W?-8;bzv{AbR>GgxE=u!`)07A`dgTP4O#$E zzWGNKfx)`Sk5Lq<pV*%|ZXCvBcH?ZW<Sox!$dxL-H?}-m4r-xSg``_!?S&6;UE{n4 z-w{%CP=CRzh4V$~F635x?}K7km<j47NV=hug#V^bpC;jrI)piM<o0^{G>Vu5(%iYZ z88BIa&y1CRkAONrZ<YNrJ!1^#LE|9W{d7-bZKv%!(BnI#y*X%i+OK<j@moV4kAt?) zRy{9h_)J~KOgqkBOm*M)yfw@+kg*N~@!8psXF(@GNVA-&mP_vhtA2gWQyY9ws~L^l za)K9W^P?NK=%ww;8TW7KFXnua%ZSnCgFeOc_afGxK`BIHo`By#K-a+^fEPf6ogl1t zAs+`Hgn_G=PeHE$egjVY3i=7_Pe4nc3f9+wOM#yT9|iZp?}Cz`9jveZ8AZdWeCA;o zbPyDx9&*)cZlj#9h1Fv4;TX>3Z=O%4ZwL4z@`mD>Tezk8{3(%3kYU-gjq@3j*Y(_K z(?)8Fyora+TMc{`JM)$#RZ6Qicor|nMAJ@i@yNqRFQ=y{<$2T3Jb33{wr>SIi;8lw z&{8axm2%my;gwu^qOr7H0sgRzHSq@;_(HB$s85V9=Y#c=IlRl8{qAk>L%8+MejHzm z;WrJRmPb+ayu7wAzJ6+~Y5xbqr$&Jvlvnq~*JAiR!*`tr{yBN2iFfhF{b#(#fdlLQ z68s>l+xZ{IJO7DaG<^Ct_yIY-FW&i2{6)j39)b_Zv3>E*f8uW%zH8)h6!ptd#j{7y zFP;|<in#lRYkM2GjEppKXkm);N|kT}^IMRE^`o36#Jo>lQtSxUv`d=-$Xm<%xp1YP z&uep(P4q0(bn+T>dbI|vU$C~kz$?-Akk-BQ<GRQ;a6K}lwprKi{2O;AWb<T!eS`Xk zUDZiKpIzAH{23j)U(h*fI(_57r{$31S^uui$I(rCaX-2sVPBzrTzgpqK7}Z0pXZ6z zpz(sqFXlU6%NLk;;dT?poVXk=hZ_|S>o&a;)+(<cFP*SP9OI;p8}w(j(ZeT9M|<`I z*zZ7RbaB#tF<AG4uw31M$0_yQdLnb4MNaqycG0jG(lf@4k>FQ{y^?F^L%v${f;FGV zB9AS$Hl7P{)<06Zzl)K)QZ1INMJ*Ez?j+u2u}^$&b|vm_dnXd@>TfHb0luyfOJMQ# z(RbIcG`SRFP`?clzGLpzKpd>gLPg|T)9;A)yJz(i@WthQQ?>2Eb1mfpwj<eV*zvVy zTHi3%L#14kd;i#dV6Pp(ocW<m=8AUa!(0fa-$Kgh=Lyhvz|w!_jegl#*8_q-GMk+{ z;PjCg>T=I@eB3@ac{;0SN(pyw4a;rISLURMjqjLVpRadO65N+q@(~dIUG!G*buo(t z@JSHmw?UUd7eLhSXxvTbJMTRe@0)GCFJEDv)bne_NE|*#(y93rt>-P^+BKH{;#fcH zX0LY_+~tcAGru2$tgqk~0`?M!z~zc^7Vk~d@A(}(E@K=&H)MCgY4aF}djI#IMmg_@ zt4n5zIdH?}-sP0J=V;w!_7>g%cN;AS1DYrMdu9DJY&Oq`c6dId1>_J+Ykdja{Nep} z-*rlD(4U0f6ssZnzXH0~$Ui%SWzF#JNj>I^zECHp_tZLv^+f3yfS0X|o6pRn(;?dZ ZvtkN#{13eqV_b)o{C-fc>2D+E{{r&+C1U^p diff --git a/tests/test.cpp b/tests/test.cpp index 45eb1fe2..2cc04fa0 100644 --- a/tests/test.cpp +++ b/tests/test.cpp @@ -433,7 +433,7 @@ void ReflectionTest(uint8_t *flatbuf, size_t length) { // Make sure the schema is what we expect it to be. auto &schema = *reflection::GetSchema(bfbsfile.c_str()); auto root_table = schema.root_table(); - TEST_EQ_STR(root_table->name()->c_str(), "Monster"); + TEST_EQ_STR(root_table->name()->c_str(), "MyGame.Example.Monster"); auto fields = root_table->fields(); auto hp_field_ptr = fields->LookupByKey("hp"); TEST_NOTNULL(hp_field_ptr); @@ -446,6 +446,14 @@ void ReflectionTest(uint8_t *flatbuf, size_t length) { TEST_NOTNULL(friendly_field_ptr->attributes()); TEST_NOTNULL(friendly_field_ptr->attributes()->LookupByKey("priority")); + // Make sure the table index is what we expect it to be. + auto pos_field_ptr = fields->LookupByKey("pos"); + TEST_NOTNULL(pos_field_ptr); + TEST_EQ(pos_field_ptr->type()->base_type(), reflection::Obj); + auto pos_table_ptr = schema.objects()->Get(pos_field_ptr->type()->index()); + TEST_NOTNULL(pos_table_ptr); + TEST_EQ_STR(pos_table_ptr->name()->c_str(), "MyGame.Example.Vec3"); + // Now use it to dynamically access a buffer. auto &root = *flatbuffers::GetAnyRoot(flatbuf); auto hp = flatbuffers::GetFieldI<uint16_t>(root, hp_field); -- GitLab