
// Copyright Peter Dimov 2001
// Copyright Aleksey Gurtovoy 2001-2004
//
// 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 "boost/mpl/bind.hpp" header
// -- DO NOT modify by hand!

namespace mars_boost {}
namespace boost = mars_boost;
namespace mars_boost {
namespace mpl {

namespace aux {

template<
    typename T, typename U1, typename U2, typename U3, typename U4, typename U5
>
struct resolve_bind_arg {
  typedef T type;
};

template<
    typename T, typename Arg
>
struct replace_unnamed_arg {
  typedef Arg next;
  typedef T type;
};

template<
    typename Arg
>
struct replace_unnamed_arg<arg < -1>, Arg > {
typedef typename Arg::next next;
typedef Arg type;
};

template<
    int N, typename U1, typename U2, typename U3, typename U4, typename U5
>
struct resolve_bind_arg<arg < N>, U1, U2, U3, U4, U5 > {
typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;
};

template<
    typename F, typename T1, typename T2, typename T3, typename T4, typename T5, typename U1, typename U2, typename U3, typename U4, typename U5
>
struct resolve_bind_arg<bind < F, T1, T2, T3, T4, T5>, U1, U2, U3, U4, U5 > {
typedef bind <F, T1, T2, T3, T4, T5> f_;
typedef typename apply_wrap5<f_, U1, U2, U3, U4, U5>::type type;
};

} // namespace aux

template<
    typename F
>
struct bind0 {
  template<
      typename U1 = na, typename U2 = na, typename U3 = na, typename U4 = na, typename U5 = na
  >
  struct apply {
  private:
    typedef aux::replace_unnamed_arg <F, mpl::arg<1>> r0;
    typedef typename r0::type a0;
    typedef typename r0::next n1;
    typedef typename aux::resolve_bind_arg<a0, U1, U2, U3, U4, U5>::type f_;
    ///
  public:
    typedef typename apply_wrap0<
        f_
    >::type type;

  };
};

namespace aux {

template<
    typename F, typename U1, typename U2, typename U3, typename U4, typename U5
>
struct resolve_bind_arg<
    bind0<F>, U1, U2, U3, U4, U5
> {
  typedef bind0<F> f_;
  typedef typename apply_wrap5<f_, U1, U2, U3, U4, U5>::type type;
};

} // namespace aux

BOOST_MPL_AUX_ARITY_SPEC(1, bind0)
BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)

template<
    typename F
>
struct bind<F, na, na, na, na, na>
    : bind0<F> {
};

template<
    typename F, typename T1
>
struct bind1 {
  template<
      typename U1 = na, typename U2 = na, typename U3 = na, typename U4 = na, typename U5 = na
  >
  struct apply {
  private:
    typedef aux::replace_unnamed_arg<F, mpl::arg < 1> > r0;
    typedef typename r0::type a0;
    typedef typename r0::next n1;
    typedef typename aux::resolve_bind_arg<a0, U1, U2, U3, U4, U5>::type f_;
    ///
    typedef aux::replace_unnamed_arg<T1, n1> r1;
    typedef typename r1::type a1;
    typedef typename r1::next n2;
    typedef aux::resolve_bind_arg<a1, U1, U2, U3, U4, U5> t1;
    ///
  public:
    typedef typename apply_wrap1<
        f_, typename t1::type
    >::type type;

  };
};

namespace aux {

template<
    typename F, typename T1, typename U1, typename U2, typename U3, typename U4, typename U5
>
struct resolve_bind_arg<
    bind1<F, T1>, U1, U2, U3, U4, U5
> {
  typedef bind1<F, T1> f_;
  typedef typename apply_wrap5<f_, U1, U2, U3, U4, U5>::type type;
};

} // namespace aux

BOOST_MPL_AUX_ARITY_SPEC(2, bind1)
BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)

template<
    typename F, typename T1
>
struct bind<F, T1, na, na, na, na>
    : bind1<F, T1> {
};

template<
    typename F, typename T1, typename T2
>
struct bind2 {
  template<
      typename U1 = na, typename U2 = na, typename U3 = na, typename U4 = na, typename U5 = na
  >
  struct apply {
  private:
    typedef aux::replace_unnamed_arg<F, mpl::arg < 1> > r0;
    typedef typename r0::type a0;
    typedef typename r0::next n1;
    typedef typename aux::resolve_bind_arg<a0, U1, U2, U3, U4, U5>::type f_;
    ///
    typedef aux::replace_unnamed_arg<T1, n1> r1;
    typedef typename r1::type a1;
    typedef typename r1::next n2;
    typedef aux::resolve_bind_arg<a1, U1, U2, U3, U4, U5> t1;
    ///
    typedef aux::replace_unnamed_arg<T2, n2> r2;
    typedef typename r2::type a2;
    typedef typename r2::next n3;
    typedef aux::resolve_bind_arg<a2, U1, U2, U3, U4, U5> t2;
    ///
  public:
    typedef typename apply_wrap2<
        f_, typename t1::type, typename t2::type
    >::type type;

  };
};

namespace aux {

template<
    typename F, typename T1, typename T2, typename U1, typename U2, typename U3, typename U4, typename U5
>
struct resolve_bind_arg<
    bind2<F, T1, T2>, U1, U2, U3, U4, U5
> {
  typedef bind2<F, T1, T2> f_;
  typedef typename apply_wrap5<f_, U1, U2, U3, U4, U5>::type type;
};

} // namespace aux

BOOST_MPL_AUX_ARITY_SPEC(3, bind2)
BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)

template<
    typename F, typename T1, typename T2
>
struct bind<F, T1, T2, na, na, na>
    : bind2<F, T1, T2> {
};

template<
    typename F, typename T1, typename T2, typename T3
>
struct bind3 {
  template<
      typename U1 = na, typename U2 = na, typename U3 = na, typename U4 = na, typename U5 = na
  >
  struct apply {
  private:
    typedef aux::replace_unnamed_arg<F, mpl::arg < 1> > r0;
    typedef typename r0::type a0;
    typedef typename r0::next n1;
    typedef typename aux::resolve_bind_arg<a0, U1, U2, U3, U4, U5>::type f_;
    ///
    typedef aux::replace_unnamed_arg<T1, n1> r1;
    typedef typename r1::type a1;
    typedef typename r1::next n2;
    typedef aux::resolve_bind_arg<a1, U1, U2, U3, U4, U5> t1;
    ///
    typedef aux::replace_unnamed_arg<T2, n2> r2;
    typedef typename r2::type a2;
    typedef typename r2::next n3;
    typedef aux::resolve_bind_arg<a2, U1, U2, U3, U4, U5> t2;
    ///
    typedef aux::replace_unnamed_arg<T3, n3> r3;
    typedef typename r3::type a3;
    typedef typename r3::next n4;
    typedef aux::resolve_bind_arg<a3, U1, U2, U3, U4, U5> t3;
    ///
  public:
    typedef typename apply_wrap3<
        f_, typename t1::type, typename t2::type, typename t3::type
    >::type type;

  };
};

namespace aux {

template<
    typename F, typename T1, typename T2, typename T3, typename U1, typename U2, typename U3, typename U4, typename U5
>
struct resolve_bind_arg<
    bind3<F, T1, T2, T3>, U1, U2, U3, U4, U5
> {
  typedef bind3<F, T1, T2, T3> f_;
  typedef typename apply_wrap5<f_, U1, U2, U3, U4, U5>::type type;
};

} // namespace aux

BOOST_MPL_AUX_ARITY_SPEC(4, bind3)
BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)

template<
    typename F, typename T1, typename T2, typename T3
>
struct bind<F, T1, T2, T3, na, na>
    : bind3<F, T1, T2, T3> {
};

template<
    typename F, typename T1, typename T2, typename T3, typename T4
>
struct bind4 {
  template<
      typename U1 = na, typename U2 = na, typename U3 = na, typename U4 = na, typename U5 = na
  >
  struct apply {
  private:
    typedef aux::replace_unnamed_arg<F, mpl::arg < 1> > r0;
    typedef typename r0::type a0;
    typedef typename r0::next n1;
    typedef typename aux::resolve_bind_arg<a0, U1, U2, U3, U4, U5>::type f_;
    ///
    typedef aux::replace_unnamed_arg<T1, n1> r1;
    typedef typename r1::type a1;
    typedef typename r1::next n2;
    typedef aux::resolve_bind_arg<a1, U1, U2, U3, U4, U5> t1;
    ///
    typedef aux::replace_unnamed_arg<T2, n2> r2;
    typedef typename r2::type a2;
    typedef typename r2::next n3;
    typedef aux::resolve_bind_arg<a2, U1, U2, U3, U4, U5> t2;
    ///
    typedef aux::replace_unnamed_arg<T3, n3> r3;
    typedef typename r3::type a3;
    typedef typename r3::next n4;
    typedef aux::resolve_bind_arg<a3, U1, U2, U3, U4, U5> t3;
    ///
    typedef aux::replace_unnamed_arg<T4, n4> r4;
    typedef typename r4::type a4;
    typedef typename r4::next n5;
    typedef aux::resolve_bind_arg<a4, U1, U2, U3, U4, U5> t4;
    ///
  public:
    typedef typename apply_wrap4<
        f_, typename t1::type, typename t2::type, typename t3::type, typename t4::type
    >::type type;

  };
};

namespace aux {

template<
    typename F, typename T1, typename T2, typename T3, typename T4, typename U1, typename U2, typename U3, typename U4, typename U5
>
struct resolve_bind_arg<
    bind4<F, T1, T2, T3, T4>, U1, U2, U3, U4, U5
> {
  typedef bind4<F, T1, T2, T3, T4> f_;
  typedef typename apply_wrap5<f_, U1, U2, U3, U4, U5>::type type;
};

} // namespace aux

BOOST_MPL_AUX_ARITY_SPEC(5, bind4)
BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)

template<
    typename F, typename T1, typename T2, typename T3, typename T4
>
struct bind<F, T1, T2, T3, T4, na>
    : bind4<F, T1, T2, T3, T4> {
};

template<
    typename F, typename T1, typename T2, typename T3, typename T4, typename T5
>
struct bind5 {
  template<
      typename U1 = na, typename U2 = na, typename U3 = na, typename U4 = na, typename U5 = na
  >
  struct apply {
  private:
    typedef aux::replace_unnamed_arg<F, mpl::arg < 1> > r0;
    typedef typename r0::type a0;
    typedef typename r0::next n1;
    typedef typename aux::resolve_bind_arg<a0, U1, U2, U3, U4, U5>::type f_;
    ///
    typedef aux::replace_unnamed_arg<T1, n1> r1;
    typedef typename r1::type a1;
    typedef typename r1::next n2;
    typedef aux::resolve_bind_arg<a1, U1, U2, U3, U4, U5> t1;
    ///
    typedef aux::replace_unnamed_arg<T2, n2> r2;
    typedef typename r2::type a2;
    typedef typename r2::next n3;
    typedef aux::resolve_bind_arg<a2, U1, U2, U3, U4, U5> t2;
    ///
    typedef aux::replace_unnamed_arg<T3, n3> r3;
    typedef typename r3::type a3;
    typedef typename r3::next n4;
    typedef aux::resolve_bind_arg<a3, U1, U2, U3, U4, U5> t3;
    ///
    typedef aux::replace_unnamed_arg<T4, n4> r4;
    typedef typename r4::type a4;
    typedef typename r4::next n5;
    typedef aux::resolve_bind_arg<a4, U1, U2, U3, U4, U5> t4;
    ///
    typedef aux::replace_unnamed_arg<T5, n5> r5;
    typedef typename r5::type a5;
    typedef typename r5::next n6;
    typedef aux::resolve_bind_arg<a5, U1, U2, U3, U4, U5> t5;
    ///
  public:
    typedef typename apply_wrap5<
        f_, typename t1::type, typename t2::type, typename t3::type, typename t4::type, typename t5::type
    >::type type;

  };
};

namespace aux {

template<
    typename F, typename T1, typename T2, typename T3, typename T4, typename T5, typename U1, typename U2, typename U3, typename U4, typename U5
>
struct resolve_bind_arg<
    bind5<F, T1, T2, T3, T4, T5>, U1, U2, U3, U4, U5
> {
  typedef bind5<F, T1, T2, T3, T4, T5> f_;
  typedef typename apply_wrap5<f_, U1, U2, U3, U4, U5>::type type;
};

} // namespace aux

BOOST_MPL_AUX_ARITY_SPEC(6, bind5)
BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)

/// primary template (not a specialization!)

template<
    typename F, typename T1, typename T2, typename T3, typename T4, typename T5
>
struct bind
    : bind5<F, T1, T2, T3, T4, T5> {
};

/// if_/eval_if specializations
template<template<typename T1, typename T2, typename T3> class F, typename Tag>
struct quote3;

template<typename T1, typename T2, typename T3>
struct if_;

template<
    typename Tag, typename T1, typename T2, typename T3
>
struct bind3<
    quote3<if_, Tag>, T1, T2, T3
> {
  template<
      typename U1 = na, typename U2 = na, typename U3 = na, typename U4 = na, typename U5 = na
  >
  struct apply {
  private:
    typedef mpl::arg<1> n1;
    typedef aux::replace_unnamed_arg<T1, n1> r1;
    typedef typename r1::type a1;
    typedef typename r1::next n2;
    typedef aux::resolve_bind_arg<a1, U1, U2, U3, U4, U5> t1;
    ///
    typedef aux::replace_unnamed_arg<T2, n2> r2;
    typedef typename r2::type a2;
    typedef typename r2::next n3;
    typedef aux::resolve_bind_arg<a2, U1, U2, U3, U4, U5> t2;
    ///
    typedef aux::replace_unnamed_arg<T3, n3> r3;
    typedef typename r3::type a3;
    typedef typename r3::next n4;
    typedef aux::resolve_bind_arg<a3, U1, U2, U3, U4, U5> t3;
    ///
    typedef typename if_<
        typename t1::type, t2, t3
    >::type f_;

  public:
    typedef typename f_::type type;
  };
};

template<
    template<typename T1, typename T2, typename T3> class F, typename Tag
>
struct quote3;

template<typename T1, typename T2, typename T3>
struct eval_if;

template<
    typename Tag, typename T1, typename T2, typename T3
>
struct bind3<
    quote3<eval_if, Tag>, T1, T2, T3
> {
  template<
      typename U1 = na, typename U2 = na, typename U3 = na, typename U4 = na, typename U5 = na
  >
  struct apply {
  private:
    typedef mpl::arg<1> n1;
    typedef aux::replace_unnamed_arg<T1, n1> r1;
    typedef typename r1::type a1;
    typedef typename r1::next n2;
    typedef aux::resolve_bind_arg<a1, U1, U2, U3, U4, U5> t1;
    ///
    typedef aux::replace_unnamed_arg<T2, n2> r2;
    typedef typename r2::type a2;
    typedef typename r2::next n3;
    typedef aux::resolve_bind_arg<a2, U1, U2, U3, U4, U5> t2;
    ///
    typedef aux::replace_unnamed_arg<T3, n3> r3;
    typedef typename r3::type a3;
    typedef typename r3::next n4;
    typedef aux::resolve_bind_arg<a3, U1, U2, U3, U4, U5> t3;
    ///
    typedef typename eval_if<
        typename t1::type, t2, t3
    >::type f_;

  public:
    typedef typename f_::type type;
  };
};

}}

