[ https://issues.apache.org/jira/browse/THRIFT-2220?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13789142#comment-13789142 ]
Martin Vogt commented on THRIFT-2220: ------------------------------------- Hello Jens, >I probably just don't see it, but why do we need a new struct type? I don't think that the struct has to be known in the IDL as new type. But at least for the compiler/generator there has to be an "escape identifier" to unmarshall the stream for a particular struct with a factory helper. For example I added in t_types.h two new methods set_is_base_Struct(bool flag) and bool is_baseStruct(). This is currently set during the Thritfy.yy run. During the generation this identifies the struct as a "virtual" struct. But this can be done (I think) with a name compare during the run of: ./thrift --gen cpp:base=TBase. Then if a struct of this name is found it sets in t_types.h the flag and then the generation behaves different. I haven't looked at the source, but I think it can be done in the generator alone. regards, Martin > Add a new struct structv? > ------------------------- > > Key: THRIFT-2220 > URL: https://issues.apache.org/jira/browse/THRIFT-2220 > Project: Thrift > Issue Type: Improvement > Components: C++ - Compiler > Affects Versions: 0.9.1 > Reporter: Martin Vogt > Priority: Minor > > Thrift cannot extend structs, but maybe its possible to add a virtual base > struct? > Today I updated the "TBase" patch for gen cpp. > https://issues.apache.org/jira/browse/THRIFT-1712 > After that, I modified the compiler to accept a new struct type, which > describes that the marshalled struct needs to be created before the > read(iproto) starts. (write already is fine, because on writing the > specialized class is already created, only the "read" needs some factory, for > the real implementation) > For example: > {code} > struct_v TMVBase <<-- struct_v tell the generator to created the > TBase class with a factory ("v" > for virtual) > service USB { > void martin(1:TMVBase base); > } > {code} > This is then generated into someting like this: > {code} > uint32_t USB_martin_args::read(::apache::thrift::protocol::TProtocol* iprot) { > [...] > switch (fid) { > case 1: > if (ftype == ::apache::thrift::protocol::T_STRUCT) { > // TBase struct create:this->base > this->base=TMVBase::create(iprot); > xfer += this->base->read(iprot); > this->__isset.base = true; > } else { > xfer += iprot->skip(ftype); > } > break > [..] > {code} > This would allow to create the derived classed (from TBase) during marshall, > without the need to define every method with any possible struct. Curently I > have modified thrifty.yy and some other things, so that > yacc actually parse this new "struct_v" type. But the generated source > for it needs to be changed some more. > The Protocolhandlers need to write the struct name on the > wire, of course (which they currenty don' do). > I think I can make a working prototype and post the patch. -- This message was sent by Atlassian JIRA (v6.1#6144)