Boost logo

Boost Users :

Subject: Re: [Boost-users] [Preprocessor] Is it possible to expand recursively?
From: TONGARI (tongari95_at_[hidden])
Date: 2011-07-18 04:04:11


2011/7/18 Edward Diener <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.

This is what I had (not working, of course):

#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

#define BUILD_SUB( x, parent, child ) \
struct BOOST_PP_TUPLE_ELEM(2, 0, child) : parent {};\
BOOST_PP_SEQ_FOR_EACH\
(\
    BUILD_SUB, BOOST_PP_TUPLE_ELEM(2, 0, child)\
  , BOOST_PP_CAT(BOOST_PP_EXPAND(PACK_2A BOOST_PP_TUPLE_ELEM(2, 1, child)),
_END)\
)

#define BUILD_HIERARCHY( root, children ) \
struct root {};\
BOOST_PP_SEQ_FOR_EACH\
(\
    BUILD_SUB, root\
  , BOOST_PP_CAT(PACK_2A children, _END)\
)

Obviously BUILD_SUB cannot be that way since the preprocessor disallows
recursion.
But even if I replace the recursive BUILD_SUB with something else the
BOOST_PP_SEQ_FOR_EACH inside BUILD_SUB still fails to expand.

I have no ideas :/

Thanks for your time.



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