Details
-
Improvement
-
Status: Closed
-
Minor
-
Resolution: Fixed
-
0.9.1
-
None
Description
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:
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); }
This is then generated into someting like this:
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 [..]
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.