Boost logo

Boost :

From: Aleksey Gurtovoy (agurtovoy_at_[hidden])
Date: 2003-01-01 22:47:28


Paul Mensonides wrote:
> Hi Aleksey,

Hi Paul,

>
> > I am going to use our wonderful Preprocessor library to generate a
> > metafunction that basically looks like this:
>
> [...]
>
> > I love everything about it except for the "(0, (1, (2, (3, (4,
> > BOOST_PP_NIL)))))" part. I would like the above to become
> something along
> > these lines:
> >
> > value = BOOST_PP_RANGE_FOLD_LEFT(
> > AUX_MAX_ARITY_OP
> > , -1
> > , BOOST_PP_RANGE(0, 4)
> > )
>
> This one is certainly possible. However, "BOOST_PP_RANGE_FOLD_LEFT"
> would just be a synonym for whatever folding macro operates on the
> type generated by "BOOST_PP_RANGE." It would be to difficult to
> make a parametizable macro that yields a sequence of numbers:
>
> BOOST_PP_SEQ_FOLD_LEFT(
> AUX_MAX_ARITY_OP
> , -1
> , BOOST_PP_SEQ_RANGE(0, 4)
> )
>
> Which is close to what you want. In fact, it is almost already
> there:
>
> #include <boost/preprocessor/seq/fold_left.hpp>
> #include <boost/preprocessor/seq/subseq.hpp>
>
> #define NUMBERS \
> (0)(1)(2)(3)(4)(5)(6)(7)(8)(9) \
> (10)(11)(12)(13)(14)(15)(16)(17)(18)(19) \
> /* ... */
>
> #define RANGE(first, length) \
> BOOST_PP_SEQ_SUBSEQ( NUMBERS, first, length ) \
> /**/
>
> BOOST_PP_SEQ_FOLD_LEFT(AUX_MAX_ARITY_OP, -1, RANGE(0, 5))
>

Looks good! How efficient is it? For instance, if NUMBERS is a sequence from
0 to 255?

> The only major difference is that BOOST_PP_SEQ_SUBSEQ takes
> first and length operands, rather than first and last.

That's no problem for me.

> Which, for the zero-case is almost the same: first ->
> BOOST_PP_INC(last). It wouldn't be too difficult to
> bang out a variant that goes from first -> last though.

Yep.

>
> > or, better yet,
> >
> > value = BOOST_PP_FOLD_LEFT(
> > AUX_MAX_ARITY_OP
> > , -1
> > , BOOST_PP_RANGE(0, 4)
> > )
> >
> > where 'BOOST_PP_FOLD_LEFT' is a generic algorithm that can
> > be used on all PP sequences.
> >
> > How hard would it be to have something like this?
>
> With C99's variadic macros, fairly easy with lists vs.
> sequences. Without them, impossible. The reason is simple,
> without variadics I have no way of telling the difference
> between (a) and (a, b), etc.... With variadics I can
> count the arguments.
>

I see. Well, I guess we have to wait till variadic macros get their way into
C++.

Thanks for your help!
Aleksey


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