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