2011/7/18 Edward Diener <eldiener@tropicsoft.com>
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.