thrift-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Samir Mulder <samir.mul...@gmail.com>
Subject Re: recursive datatypes
Date Tue, 04 Aug 2009 17:22:11 GMT
Thanks, David.

My server side is C++ and I understand/see the issue by not using  
pointers. So it would indeed by a far-reaching change.

I'll look into your 'filesystem' approach as a possible workaround.

Thanks!

Paul

On Aug 4, 2009, at 10:13 AM, David Reiss wrote:

> The biggest problem in the languages that I'm familiar with is
> C++.  Unlike Protocol Buffers, we store members directly in our
> structures (rather than by pointers), so our members are not
> nullable.  Therefore, it is impossible to have something like
>
> struct Folder {
>  optional 1: Folder parent;
> }
>
> since that would require infinite memory.  The list case is possible
> in theory, but I think it would require a lot of work.
>
> There are other "gotchas" that would come up.  For example, I think
> the code in the Python generator that creates the type specification
> passed to the protocol accelerator module is not recursion-safe.
>
> One workaround you can use is to create something like an inode table
> in your struct.
>
> struct Folder {
>  1: string name;
>  2: list<i32> subfolders;
> }
>
> struct FileSystem {
>  1: list<Folder> folders;
> }
>
> The subfolder integers are indexes into the "folders" list in the
> "FileSystem" struct.
>
> --David
>
> Bryan Duxbury wrote:
>> Up to this point we have avoided it, and it's not on the roadmap.
>> There have been a few discussions in the past about why we haven't
>> done this to date.
>>
>> If someone wanted to tackle this feature, the first thing that would
>> need to be done is to make the compiler ok with references to structs
>> that don't appear before them lexically. From there it probably
>> wouldn't be too much of challenge. Maybe David or someone else with a
>> deeper sense can chime in?
>>
>> -Bryan
>>
>> On Aug 4, 2009, at 9:50 AM, Samir Mulder wrote:
>>
>>> Hi,
>>>
>>> I've been using Thrift for over a year now and love it. It has
>>> really increased my productivity in rolling out distributes  
>>> services.
>>>
>>> But the project I'm working on now needs a feature I haven't needed
>>> before and Thrift does not seem to support it. And that is
>>> recursion in a datatype. The example is that of a folder with
>>> subfolders:
>>>
>>> struct Folder
>>> {
>>>  1: some data....
>>>  2: list<Folder> subfolders
>>> }
>>>
>>> The compiler does not allow this since the type 'Folder' is not yet
>>> defined when it reaches the 'subfolders' item.
>>>
>>> For this particular project allowing recursion is critical. Google
>>> Protocol Buffers supports it but I don't really want to switch to
>>> that this late in the game.
>>>
>>> Any ideas on how to work around this? Is something like this
>>> planned for a future release?
>>>
>>> Thanks.
>>>
>>> Samir
>>


Mime
View raw message