
// Copyright Aleksey Gurtovoy 2000-2008
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//

// *Preprocessed* version of the main "apply_wrap.hpp" header
// -- DO NOT modify by hand!

namespace boost {
namespace mpl {

template<
    int N, typename F
    >
struct apply_wrap_impl0;

template<
    typename F
    >
struct apply_wrap_impl0<
    0
    , F

    >
{
    typedef typename F::template apply<

        /// since the defaults are "lost", we have to pass *something* even for nullary
        /// metafunction classes
        na
        > type;
};

template<
    typename F
    >
struct apply_wrap_impl0<
    1
    , F

    >
{
    typedef typename F::template apply<

        na
        > type;
};

template<
    typename F
    >
struct apply_wrap_impl0<
    2
    , F

    >
{
    typedef typename F::template apply<

        na, na

        > type;
};

template<
    typename F
    >
struct apply_wrap_impl0<
    3
    , F

    >
{
    typedef typename F::template apply<

        na, na, na

        > type;
};

template<
    typename F
    >
struct apply_wrap_impl0<
    4
    , F

    >
{
    typedef typename F::template apply<

        na, na, na, na

        > type;
};

template<
    typename F
    >
struct apply_wrap_impl0<
    5
    , F

    >
{
    typedef typename F::template apply<

        na, na, na, na, na

        > type;
};

template<
    typename F
    >
struct apply_wrap0
    : apply_wrap_impl0<
      ::boost::mpl::aux::arity< F,0 >::value
    , F

    >::type
{
};

template<
    int N, typename F, typename T1
    >
struct apply_wrap_impl1;

template<
    typename F, typename T1
    >
struct apply_wrap_impl1<
    1
    , F
    , T1
    >
{
    typedef typename F::template apply<
        T1
        > type;
};

template<
    typename F, typename T1
    >
struct apply_wrap_impl1<
    2
    , F
    , T1
    >
{
    typedef typename F::template apply<
        T1
    , na

    > type;
};

template<
    typename F, typename T1
    >
struct apply_wrap_impl1<
    3
    , F
    , T1
    >
{
    typedef typename F::template apply<
        T1
    , na, na

    > type;
};

template<
    typename F, typename T1
    >
struct apply_wrap_impl1<
    4
    , F
    , T1
    >
{
    typedef typename F::template apply<
        T1
    , na, na, na

    > type;
};

template<
    typename F, typename T1
    >
struct apply_wrap_impl1<
    5
    , F
    , T1
    >
{
    typedef typename F::template apply<
        T1
    , na, na, na, na

    > type;
};

template<
    typename F, typename T1
    >
struct apply_wrap1
    : apply_wrap_impl1<
      ::boost::mpl::aux::arity< F,1 >::value
    , F
    , T1
    >::type
{
};

template<
    int N, typename F, typename T1, typename T2
    >
struct apply_wrap_impl2;

template<
    typename F, typename T1, typename T2
    >
struct apply_wrap_impl2<
    2
    , F
    , T1, T2
    >
{
    typedef typename F::template apply<
        T1, T2

        > type;
};

template<
    typename F, typename T1, typename T2
    >
struct apply_wrap_impl2<
    3
    , F
    , T1, T2
    >
{
    typedef typename F::template apply<
        T1, T2

    , na

    > type;
};

template<
    typename F, typename T1, typename T2
    >
struct apply_wrap_impl2<
    4
    , F
    , T1, T2
    >
{
    typedef typename F::template apply<
        T1, T2

    , na, na

    > type;
};

template<
    typename F, typename T1, typename T2
    >
struct apply_wrap_impl2<
    5
    , F
    , T1, T2
    >
{
    typedef typename F::template apply<
        T1, T2

    , na, na, na

    > type;
};

template<
    typename F, typename T1, typename T2
    >
struct apply_wrap2
    : apply_wrap_impl2<
      ::boost::mpl::aux::arity< F,2 >::value
    , F
    , T1, T2
    >::type
{
};

template<
    int N, typename F, typename T1, typename T2, typename T3
    >
struct apply_wrap_impl3;

template<
    typename F, typename T1, typename T2, typename T3
    >
struct apply_wrap_impl3<
    3
    , F
    , T1, T2, T3
    >
{
    typedef typename F::template apply<
        T1, T2, T3

        > type;
};

template<
    typename F, typename T1, typename T2, typename T3
    >
struct apply_wrap_impl3<
    4
    , F
    , T1, T2, T3
    >
{
    typedef typename F::template apply<
        T1, T2, T3

    , na

    > type;
};

template<
    typename F, typename T1, typename T2, typename T3
    >
struct apply_wrap_impl3<
    5
    , F
    , T1, T2, T3
    >
{
    typedef typename F::template apply<
        T1, T2, T3

    , na, na

    > type;
};

template<
    typename F, typename T1, typename T2, typename T3
    >
struct apply_wrap3
    : apply_wrap_impl3<
      ::boost::mpl::aux::arity< F,3 >::value
    , F
    , T1, T2, T3
    >::type
{
};

template<
    int N, typename F, typename T1, typename T2, typename T3, typename T4
    >
struct apply_wrap_impl4;

template<
    typename F, typename T1, typename T2, typename T3, typename T4
    >
struct apply_wrap_impl4<
    4
    , F
    , T1, T2, T3, T4
    >
{
    typedef typename F::template apply<
        T1, T2, T3, T4

        > type;
};

template<
    typename F, typename T1, typename T2, typename T3, typename T4
    >
struct apply_wrap_impl4<
    5
    , F
    , T1, T2, T3, T4
    >
{
    typedef typename F::template apply<
        T1, T2, T3, T4

    , na

    > type;
};

template<
    typename F, typename T1, typename T2, typename T3, typename T4
    >
struct apply_wrap4
    : apply_wrap_impl4<
      ::boost::mpl::aux::arity< F,4 >::value
    , F
    , T1, T2, T3, T4
    >::type
{
};

template<
    int N, typename F, typename T1, typename T2, typename T3, typename T4
    , typename T5
    >
struct apply_wrap_impl5;

template<
    typename F, typename T1, typename T2, typename T3, typename T4
    , typename T5
    >
struct apply_wrap_impl5<
    5
    , F
    , T1, T2, T3, T4, T5
    >
{
    typedef typename F::template apply<
        T1, T2, T3, T4, T5

        > type;
};

template<
    typename F, typename T1, typename T2, typename T3, typename T4
    , typename T5
    >
struct apply_wrap5
    : apply_wrap_impl5<
      ::boost::mpl::aux::arity< F,5 >::value
    , F
    , T1, T2, T3, T4, T5
    >::type
{
};

}
}
