Boost logo

Boost :

Subject: [boost] [1.43.0][preprocessor] BOOST_PP_SEQ_FOR_EACH doesn't work recursively
From: Adam Badura (abadura_at_[hidden])
Date: 2010-05-21 06:20:49


BOOST_PP_SEQ_FOR_EACH macro when used within another BOOST_PP_SEQ_FOR_EACH
does not expand at all (and the same happens with _R versions). I use Visual
Studio 2005.

A simple test is:
>>>>>>>>>>>>>>>>>>>>
#include <boost/preprocessor.hpp>

#define SEQ \
        ( ( n1 )( n2 )( n3 ) ) \
        ( ( n4 )( n5 )( n6 ) )

#define CAT( _r, _data, _elem ) \
        BOOST_PP_CAT( _data, _elem )

#define JOIN( _r, _seq ) \
        BOOST_PP_SEQ_FOR_EACH_R( _r, CAT, ::, _seq )

#define MAKE( _r, _data, _elem ) \
        JOIN( _r, _elem )

BOOST_PP_SEQ_FOR_EACH( MAKE, nil, SEQ )
<<<<<<<<<<<<<<<<<<<<

The expected result is something like:
>>>>>>>>>>>>>>>>>>>>
::n1 ::n2 ::n3 ::n4 ::n5 ::n6
<<<<<<<<<<<<<<<<<<<<

while it is not. Instead we get something like:
>>>>>>>>>>>>>>>>>>>>
BOOST_PP_SEQ_FOR_EACH_M(3, (CAT, ::, ( n1 )( n2 )( n3 ) (nil)))
BOOST_PP_SEQ_FOR_EACH_M(4, (CAT, ::, ( n2 )( n3 ) (nil)))
BOOST_PP_SEQ_FOR_EACH_M(5, (CAT, ::, ( n3 ) (nil)))
BOOST_PP_SEQ_FOR_EACH_M(4, (CAT, ::, ( n4 )( n5 )( n6 ) (nil)))
BOOST_PP_SEQ_FOR_EACH_M(5, (CAT, ::, ( n5 )( n6 ) (nil)))
BOOST_PP_SEQ_FOR_EACH_M(6, (CAT, ::, ( n6 ) (nil)))
<<<<<<<<<<<<<<<<<<<<

It seems to me that something is wrong with BOOST_PP_SEQ_FOR_EACH(_R)
because following JOIN macro works well in this test case:
>>>>>>>>>>>>>>>>>>>>
#define JOIN( _r, _seq ) \
        BOOST_PP_LIST_FOR_EACH_R( \
                _r, \
                CAT, \
                ::, \
                BOOST_PP_TUPLE_TO_LIST( BOOST_PP_SEQ_SIZE( _seq ),
BOOST_PP_SEQ_TO_TUPLE( _seq ) ) \
        )
<<<<<<<<<<<<<<<<<<<<

While all it does it to use BOOST_PP_LIST_FOR_EACH_R instead of
BOOST_PP_SEQ_FOR_EACH_R and change the given sequence to a tuple and then
that tuple to a list.

    Adam Badura
 


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk