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
_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to