From: Aleksey Gurtovoy (agurtovoy_at_[hidden])
Date: 2003-01-01 04:43:35


I am going to use our wonderful Preprocessor library to generate a
metafunction that basically looks like this:

    template<
          int C0, int C1, ..., int Cn
>
    struct max_arity
    {
        static int const value = Cn > 0 ? Cn : ( Cn-1 > 0 ? Cn-1 :
            ... ( C1 > 0 ? C1 : ( C0 > 0 ? C0 : -1 ) ) )
            ;
    };

So here's what I came up with:

    template<
          BOOST_PP_ENUM_PARAMS(BOOST_MPL_METAFUNCTION_MAX_ARITY, int C)
>
    struct max_arity
    {
        BOOST_STATIC_CONSTANT(int,
            value = BOOST_PP_LIST_FOLD_LEFT(
                      AUX_MAX_ARITY_OP
                    , -1
                    , (0, (1, (2, (3, (4, BOOST_PP_NIL)))))
                    )
            );
    };

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)
                    )

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?

I suppose it's possible to generate the code I need using BOOST_PP_WHILE,
but IMO that solution wouldn't be as conceptually nice and intuitive as the
above.

Aleksey