[ 
https://issues.apache.org/jira/browse/THRIFT-2220?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13787762#comment-13787762
 ] 

Henrique Mendonça commented on THRIFT-2220:
-------------------------------------------

Hi Martin,

It sounds like a nice idea, but have you thought about this on other strongly 
typed languages, e.g. Java, C#?
I think it might get quite tricky to implement but might be doable. Anyway, it 
would be nice to have it at least in another target language before we think on 
changing the IDL.
By the way, there is probably something a little clearer than struct_v, perhaps 
external, import, or something like that? But that's just a detail.

Cheers,
Henrique

> 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)

Reply via email to