Boost logo

Boost Users :

Subject: Re: [Boost-users] [Preprocessor] Is it possible to expand recursively?
From: TONGARI (tongari95_at_[hidden])
Date: 2011-07-19 10:51:59


2011/7/19 Edward Diener <eldiener_at_[hidden]>

> On 7/18/2011 4:04 AM, TONGARI wrote:
>
>> 2011/7/18 Edward Diener <eldiener_at_[hidden]
>> <mailto:eldiener_at_tropicsoft.**com <eldiener_at_[hidden]>>>
>>
>>
>> On 7/17/2011 1:29 PM, Edward Diener wrote:
>>
>> On 7/17/2011 9:21 AM, TONGARI wrote:
>>
>> Hello,
>>
>> I'd like to have a macro like:
>>
>> BUILD_HIERARCHY
>> (a,
>> (b,)
>> (c,
>> (d,)
>> (e,)
>> )
>> )
>>
>> which should expand to:
>>
>> struct a {};
>> struct b: a {};
>> struct c: a {};
>> struct d: c {};
>> struct e: c {};
>>
>> Is this possible at all?
>> I have tried but with no luck, if this is impossible, please
>> tell me so.
>>
>>
>> I think you want above:
>>
>> (a,
>> (b)
>> (c,
>> (d)
>> (e)
>> )
>> )
>>
>> This is a tuple with a possible second element as a seq. Each
>> element of
>> your seq is a tuple with the same rule as the top tuple.
>>
>> Following internal logic, perhaps with nested BOOST_PP_WHILEs, you
>> should be able to cycle through each tuple and nested tuple
>> forming the
>> relationships you have created for your structs above. I can not
>> guarantee this will be doable but at least you should have some
>> idea of
>> what to do from the description of what you have.
>>
>>
>> I have to correct the above. The syntax for what I described must be:
>>
>> (a,
>> ((b))
>> ((c,
>> (d)
>> (e))
>> )
>>
>> )
>>
>>
>> I think I need the comma since I don't assume variadic macro.
>>
>
> I do not understand what you mean by that, and what some extra comma has to
> do with variadic macros
>

Without variadic macro we can just leave the 2nd arg empty (e.g. MACRO(x, )
where MACRO requires 2 args) as no derived classes.

> I still do not have the above right. It should be:
>
>
> (a,
> ((b))
> ((c,
> ((d))
> ((e))
> )
> )
> )
>

IIUC, your surrounding ()s here are automatically packed by what I had:

#define PACK_2A( a1, a2 ) ((a1, a2)) PACK_2B
#define PACK_2B( a1, a2 ) ((a1, a2)) PACK_2A
#define PACK_2A_END
#define PACK_2B_END

and used like: BOOST_PP_CAT(PACK_2A children, _END)

BTW, if variadic macro available, they'd be

#define PACK_A( VARG... ) (( VARG )) PACK_B
#define PACK_B( VARG... ) (( VARG )) PACK_A
#define PACK_A_END
#define PACK_B_END

[...]

Just in case you do not know, you can use the Wave trace facility to see how
> your macros above are expanding when you invoke BUILD_HIERARCHY with your
> two parameters.

I used to use BOOST_PP_STRINGIZE to show me the result.
It turns out that BOOST_PP_SEQ_FOR_EACH cannot be used recursively.

...and I have to say I must give up on this temporarily, if I have time to
back to this again, I'll see if Wave can help me figure out what happened.

Thanks for your patience.



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net