From b075b8c49d4a5ea296c25599ef929d6d090cc8b3 Mon Sep 17 00:00:00 2001 From: jbrads Date: Mon, 3 Oct 2016 22:14:25 +0100 Subject: [PATCH] =?UTF-8?q?=20Generate=20type=20traits=20for=20unions=20to?= =?UTF-8?q?=20map=20a=20type=20to=20the=20corresponding=20u=E2=80=A6=20(#4?= =?UTF-8?q?032)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Generate type traits for unions to map a type to the corresponding union enum value. * Fixed break with union enum type traits when type is in a namespace. * Fixed spacing and variable names in type traits generation to match style guidelines. * Fixed spacing in type traits generation to match style guidelines. * Regenerated test schema header. --- src/idl_gen_cpp.cpp | 19 ++++++++++++++++++- tests/monster_test.bfbs | Bin 3384 -> 3320 bytes tests/monster_test_generated.h | 16 ++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/idl_gen_cpp.cpp b/src/idl_gen_cpp.cpp index 74a6bf9a0..bf7472d99 100644 --- a/src/idl_gen_cpp.cpp +++ b/src/idl_gen_cpp.cpp @@ -483,7 +483,24 @@ class CppGenerator : public BaseGenerator { } code += "]; }\n\n"; } - + + // Generate type traits for unions to map from a type to union enum value. + if (enum_def.is_union) { + for (auto it = enum_def.vals.vec.begin(); + it != enum_def.vals.vec.end(); + ++it) { + auto &ev = **it; + if (it == enum_def.vals.vec.begin()) { + code += "template struct " + enum_def.name + "Traits {\n"; + } + else { + code += "template<> struct " + enum_def.name + "Traits<" + WrapInNameSpace(*ev.struct_def) + "> {\n"; + } + code += " static const " + enum_def.name + " enum_value = " + GenEnumValDecl(enum_def, ev.name, parser_.opts) + ";\n"; + code += "};\n\n"; + } + } + if (enum_def.is_union) { code += UnionVerifySignature(enum_def) + ";\n\n"; } diff --git a/tests/monster_test.bfbs b/tests/monster_test.bfbs index 0369f896935ecf0822e50268c42f9fa4dfb9da87..66d3ee8f215a67b4978d70df9bdb2e6d344e89b8 100644 GIT binary patch literal 3320 zcmZu!O-Ni<6h5P)^P`R?vB@;C!GsW`$Y4g1P^4HJ6AIBlwANM3(|OYwn0YhIypdQ+ z>7oQzp>!cGT!d0e2w9ZkqKgtjR}w7t7gN};J~ZC}6d{>)5=xo|x9&H2u` z=kK2P91@Y4i!%#gSP4l=SfbJ^12Tvw!C#Rv&=lwb=<^Pd2>2#=G$!(KkI0j_$T!%J z^@=^%wH=WzktJxF6*G+^knCLK25g81ZO*`jmk;$|3BTGkez4 ze}jNIAZOXklV|+^JNzvQvWw@; z6lyM?e=_psxVrHBrHbo%CI;#<2ef1T$5x$t)y-g+fQ)@2h*#H+oPJM(PJxW?SNxn? znMVZ|%Fddbx>zX{-}BZAwG5r1?GX@9OQ;O#+~J3q_Aibz=)LxbJNjiTEI9?#1F_q@ z(cV!|OWthS2|tPy9*Xz+#)=hvaNq zy!D^>d5w>L2R?u)(bm54pZHHSKJp8AznoTh&J^mgUMv)GUu#^)z+XX-kl{KGqfg=7 zV%f*Yl`kL%>qkq=6!v{`QelVjOuMw{f!s{C;P|VxY*r0b*}|+tPlwCU=~X?b=L&nv z_1q$Dzc9A3m2K>MWrN*C|HE!Sbsj;7)7$2xMMvK+;7)6uz60Q6 zm=wgb|81X7V7m0;encSQoS}VOUm3-{j3P?nSx<}x6)%|FRd-hXEQ{DjaJz|PPHYZW z{Ef1U=cgLW6v}Pnr5kF*F;42(MSs@Ju#c;IBx<(rLca@>l341{e%@PmJ-<}hfX7kg zyPlEEc@oj_O>U#%JBXe!W~>n3R@2yA1~Dc&##yT8L{yz)V<9hB@}){%wS&T*Q&^E~ zCGUEf0!t|`b&MTJoYQDya2||9_E4Xr?vamuSk<)=FL8KH$?qDc`g{lbP8HYxaqPDxjq7~?Zga=znfH%C z>ssFP96W@I+PqQD2G#ROdiEf1mNAZRjqV+A+MEDU?<}aLo{Mn1?PnnIyqmWFSQqBR zE?XD&AM?(-*wwiAoI|`V_U7vQKVa?zznH0S?AB{YTVYU}8q!~N)-vSUKh6dFJ%At0 zqJJTE!*stfo>kCebq}PI6Gdm$C>TaP=97L=$5HoNPaHiNLL3 n?e~5T@;ZbQY0%8aS_CY3lSH^g^M7?g$pUgbrw}qfBO8sd*6NYGQ=Cs+;{K& z&i_5Wixn5c`g?>+Q9OpvD6cQJ2+ z@}LpW5NKiZvQ@Fi=dM|mTG<|d!Pyk~!Sg)I_!W9-ml-GUpz*6dKD)Y5bsDZ+$4QU! zJq4R!sg+cezAeIcu$KzgBXKb565@lOFKI5IN0HpK`EV8INbi!|3|$ zvFFi0(&EzM945I6n@2Gl-* z%z4ZoW8Mc%fnvZP2d*OrCcTpR)AL494U8XD%Jsh)kN!U1R~Prks@JW}YN6rQOU|2F zkt@KTlIH?^6l*|xVYCIxqM1U{!AkGqttM;g;fR4MDBy_=Zf>C2sRpev2P|C95i zoX4rosq@~cy+@~$GdFx03@vRhQ1HIzrIA(R-&_AE|Ds%n{9CJ5%MHROfIlJG0DoW0 z>^bV=i&mr9JU_Ksa9Zaq?B#(!E)xNM2y1L7!}vxBe-r0V$asLC)%Zjh-<-?_^1sFT zu#5%xy2i)D_(ll7hx23dY=Hk%<9m$1Vf$gHWFC3mkc z*4R#j@y34Qw{Sj)uFP}ZudK$$!+2vq@n7P6K%NQkYZ@PA4KZI#6mdUezh5#z9k2YQ z>=?k67qo7LwJS9jEmmSU>yxJgnGSjy?s$wnfHEDBy-_Gz?pm`@Pz_e5!IQ#GC5Co? z<;%yT@P65jU7_qe_Iq)w4emC27Gw_)XL97%kjo~_OLhx9?BFIQkF`C09e7=Hz|TWw z5>=eRGkMr)QmCyss)Id;`cU@DF8VWt=Y8l%z$#-`OVzbzr$5ADk_`6acsm)~CmP2v z260?0^u$HcOWQx-;qZ?kzkTmaEOI-qT2A4=d)$IhIc!%G84GfK{a;-(#PGFJ zt2X3o@KGLP!x(b^4Co!u4ColB<6W}sTCNl!i@umRoYb<9==;!gc-cO{9_=-l=QSot z9WA^tSrNQ1>cxm(GjyC|0bfh=^)Wsr1Z_gqk3`0>CO740Kz#dbfpVZx&>m<9bQ5%l zA1n6yq>|Mgs^>4X>;v^R3I5lyAA`lFZtiJZPy?(lyuxG)`(3ce_?*?a6yrh+@8LG~ z!m(S?m|n*JZP52vM{tXcj8^De*M`31fF2l(o8kE^#B&Y%cd(}ICePG04>}9#$Zrm2 z9{L%XMo%^Qq8>9$zL*c*CFZF;*t=LgrjjLynduvYh%4ptYnwLuvLlqm{8Aq8Eaw_% z3Uo+5X?Jj^^tT9r{-BK!NHFo?cR03`Eo*p4qd)1dMxVi-$VWT0P3&8`6X`xI-HfB9 w&ck1w8c!Y*Z#+u-8{hm-kR3N4X7t>|fLN_hBAqg5%i-UuuR6_!`T&;y0O$Nw(e)]; } +template struct AnyTraits { + static const Any enum_value = Any_NONE; +}; + +template<> struct AnyTraits { + static const Any enum_value = Any_Monster; +}; + +template<> struct AnyTraits { + static const Any enum_value = Any_TestSimpleTableWithEnum; +}; + +template<> struct AnyTraits { + static const Any enum_value = Any_MyGame_Example2_Monster; +}; + inline bool VerifyAny(flatbuffers::Verifier &verifier, const void *union_obj, Any type); MANUALLY_ALIGNED_STRUCT(2) Test FLATBUFFERS_FINAL_CLASS {