/////////////////////////////////////////////////////////////////////////////// | |
// funop.hpp | |
// Contains definition of funop[n]\<\> class template. | |
// | |
// Copyright 2008 Eric Niebler. 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) | |
template<typename Expr, typename Domain > | |
struct funop0 | |
{ | |
typedef typename proto::base_expr< | |
Domain | |
, tag::function | |
, list1< | |
Expr & | |
> | |
>::type type; | |
static type const call( | |
Expr &e | |
) | |
{ | |
type that = { | |
e | |
}; | |
return that; | |
} | |
}; | |
template<typename Expr , typename This, typename Domain> | |
struct funop<Expr(), This, Domain> | |
: funop0< | |
typename detail::same_cv<Expr, This>::type | |
, Domain | |
> | |
{}; | |
template<typename Expr, typename Domain , typename A0> | |
struct funop1 | |
{ | |
typedef typename proto::base_expr< | |
Domain | |
, tag::function | |
, list2< | |
Expr & | |
, typename proto::result_of::as_child<A0, Domain>::type | |
> | |
>::type type; | |
static type const call( | |
Expr &e | |
, A0 &a0 | |
) | |
{ | |
type that = { | |
e | |
, proto::as_child<Domain>(a0) | |
}; | |
return that; | |
} | |
}; | |
template<typename Expr , typename A0, typename This, typename Domain> | |
struct funop<Expr(A0), This, Domain> | |
: funop1< | |
typename detail::same_cv<Expr, This>::type | |
, Domain | |
, typename remove_reference<A0 >::type | |
> | |
{}; | |
template<typename Expr, typename Domain , typename A0 , typename A1> | |
struct funop2 | |
{ | |
typedef typename proto::base_expr< | |
Domain | |
, tag::function | |
, list3< | |
Expr & | |
, typename proto::result_of::as_child<A0, Domain>::type , typename proto::result_of::as_child<A1, Domain>::type | |
> | |
>::type type; | |
static type const call( | |
Expr &e | |
, A0 &a0 , A1 &a1 | |
) | |
{ | |
type that = { | |
e | |
, proto::as_child<Domain>(a0) , proto::as_child<Domain>(a1) | |
}; | |
return that; | |
} | |
}; | |
template<typename Expr , typename A0 , typename A1, typename This, typename Domain> | |
struct funop<Expr(A0 , A1), This, Domain> | |
: funop2< | |
typename detail::same_cv<Expr, This>::type | |
, Domain | |
, typename remove_reference<A0 >::type , typename remove_reference<A1 >::type | |
> | |
{}; | |
template<typename Expr, typename Domain , typename A0 , typename A1 , typename A2> | |
struct funop3 | |
{ | |
typedef typename proto::base_expr< | |
Domain | |
, tag::function | |
, list4< | |
Expr & | |
, typename proto::result_of::as_child<A0, Domain>::type , typename proto::result_of::as_child<A1, Domain>::type , typename proto::result_of::as_child<A2, Domain>::type | |
> | |
>::type type; | |
static type const call( | |
Expr &e | |
, A0 &a0 , A1 &a1 , A2 &a2 | |
) | |
{ | |
type that = { | |
e | |
, proto::as_child<Domain>(a0) , proto::as_child<Domain>(a1) , proto::as_child<Domain>(a2) | |
}; | |
return that; | |
} | |
}; | |
template<typename Expr , typename A0 , typename A1 , typename A2, typename This, typename Domain> | |
struct funop<Expr(A0 , A1 , A2), This, Domain> | |
: funop3< | |
typename detail::same_cv<Expr, This>::type | |
, Domain | |
, typename remove_reference<A0 >::type , typename remove_reference<A1 >::type , typename remove_reference<A2 >::type | |
> | |
{}; | |
template<typename Expr, typename Domain , typename A0 , typename A1 , typename A2 , typename A3> | |
struct funop4 | |
{ | |
typedef typename proto::base_expr< | |
Domain | |
, tag::function | |
, list5< | |
Expr & | |
, typename proto::result_of::as_child<A0, Domain>::type , typename proto::result_of::as_child<A1, Domain>::type , typename proto::result_of::as_child<A2, Domain>::type , typename proto::result_of::as_child<A3, Domain>::type | |
> | |
>::type type; | |
static type const call( | |
Expr &e | |
, A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 | |
) | |
{ | |
type that = { | |
e | |
, proto::as_child<Domain>(a0) , proto::as_child<Domain>(a1) , proto::as_child<Domain>(a2) , proto::as_child<Domain>(a3) | |
}; | |
return that; | |
} | |
}; | |
template<typename Expr , typename A0 , typename A1 , typename A2 , typename A3, typename This, typename Domain> | |
struct funop<Expr(A0 , A1 , A2 , A3), This, Domain> | |
: funop4< | |
typename detail::same_cv<Expr, This>::type | |
, Domain | |
, typename remove_reference<A0 >::type , typename remove_reference<A1 >::type , typename remove_reference<A2 >::type , typename remove_reference<A3 >::type | |
> | |
{}; | |
template<typename Expr, typename Domain , typename A0 , typename A1 , typename A2 , typename A3 , typename A4> | |
struct funop5 | |
{ | |
typedef typename proto::base_expr< | |
Domain | |
, tag::function | |
, list6< | |
Expr & | |
, typename proto::result_of::as_child<A0, Domain>::type , typename proto::result_of::as_child<A1, Domain>::type , typename proto::result_of::as_child<A2, Domain>::type , typename proto::result_of::as_child<A3, Domain>::type , typename proto::result_of::as_child<A4, Domain>::type | |
> | |
>::type type; | |
static type const call( | |
Expr &e | |
, A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 , A4 &a4 | |
) | |
{ | |
type that = { | |
e | |
, proto::as_child<Domain>(a0) , proto::as_child<Domain>(a1) , proto::as_child<Domain>(a2) , proto::as_child<Domain>(a3) , proto::as_child<Domain>(a4) | |
}; | |
return that; | |
} | |
}; | |
template<typename Expr , typename A0 , typename A1 , typename A2 , typename A3 , typename A4, typename This, typename Domain> | |
struct funop<Expr(A0 , A1 , A2 , A3 , A4), This, Domain> | |
: funop5< | |
typename detail::same_cv<Expr, This>::type | |
, Domain | |
, typename remove_reference<A0 >::type , typename remove_reference<A1 >::type , typename remove_reference<A2 >::type , typename remove_reference<A3 >::type , typename remove_reference<A4 >::type | |
> | |
{}; | |
template<typename Expr, typename Domain , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5> | |
struct funop6 | |
{ | |
typedef typename proto::base_expr< | |
Domain | |
, tag::function | |
, list7< | |
Expr & | |
, typename proto::result_of::as_child<A0, Domain>::type , typename proto::result_of::as_child<A1, Domain>::type , typename proto::result_of::as_child<A2, Domain>::type , typename proto::result_of::as_child<A3, Domain>::type , typename proto::result_of::as_child<A4, Domain>::type , typename proto::result_of::as_child<A5, Domain>::type | |
> | |
>::type type; | |
static type const call( | |
Expr &e | |
, A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 , A4 &a4 , A5 &a5 | |
) | |
{ | |
type that = { | |
e | |
, proto::as_child<Domain>(a0) , proto::as_child<Domain>(a1) , proto::as_child<Domain>(a2) , proto::as_child<Domain>(a3) , proto::as_child<Domain>(a4) , proto::as_child<Domain>(a5) | |
}; | |
return that; | |
} | |
}; | |
template<typename Expr , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5, typename This, typename Domain> | |
struct funop<Expr(A0 , A1 , A2 , A3 , A4 , A5), This, Domain> | |
: funop6< | |
typename detail::same_cv<Expr, This>::type | |
, Domain | |
, typename remove_reference<A0 >::type , typename remove_reference<A1 >::type , typename remove_reference<A2 >::type , typename remove_reference<A3 >::type , typename remove_reference<A4 >::type , typename remove_reference<A5 >::type | |
> | |
{}; | |
template<typename Expr, typename Domain , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6> | |
struct funop7 | |
{ | |
typedef typename proto::base_expr< | |
Domain | |
, tag::function | |
, list8< | |
Expr & | |
, typename proto::result_of::as_child<A0, Domain>::type , typename proto::result_of::as_child<A1, Domain>::type , typename proto::result_of::as_child<A2, Domain>::type , typename proto::result_of::as_child<A3, Domain>::type , typename proto::result_of::as_child<A4, Domain>::type , typename proto::result_of::as_child<A5, Domain>::type , typename proto::result_of::as_child<A6, Domain>::type | |
> | |
>::type type; | |
static type const call( | |
Expr &e | |
, A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 , A4 &a4 , A5 &a5 , A6 &a6 | |
) | |
{ | |
type that = { | |
e | |
, proto::as_child<Domain>(a0) , proto::as_child<Domain>(a1) , proto::as_child<Domain>(a2) , proto::as_child<Domain>(a3) , proto::as_child<Domain>(a4) , proto::as_child<Domain>(a5) , proto::as_child<Domain>(a6) | |
}; | |
return that; | |
} | |
}; | |
template<typename Expr , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6, typename This, typename Domain> | |
struct funop<Expr(A0 , A1 , A2 , A3 , A4 , A5 , A6), This, Domain> | |
: funop7< | |
typename detail::same_cv<Expr, This>::type | |
, Domain | |
, typename remove_reference<A0 >::type , typename remove_reference<A1 >::type , typename remove_reference<A2 >::type , typename remove_reference<A3 >::type , typename remove_reference<A4 >::type , typename remove_reference<A5 >::type , typename remove_reference<A6 >::type | |
> | |
{}; | |
template<typename Expr, typename Domain , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7> | |
struct funop8 | |
{ | |
typedef typename proto::base_expr< | |
Domain | |
, tag::function | |
, list9< | |
Expr & | |
, typename proto::result_of::as_child<A0, Domain>::type , typename proto::result_of::as_child<A1, Domain>::type , typename proto::result_of::as_child<A2, Domain>::type , typename proto::result_of::as_child<A3, Domain>::type , typename proto::result_of::as_child<A4, Domain>::type , typename proto::result_of::as_child<A5, Domain>::type , typename proto::result_of::as_child<A6, Domain>::type , typename proto::result_of::as_child<A7, Domain>::type | |
> | |
>::type type; | |
static type const call( | |
Expr &e | |
, A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 , A4 &a4 , A5 &a5 , A6 &a6 , A7 &a7 | |
) | |
{ | |
type that = { | |
e | |
, proto::as_child<Domain>(a0) , proto::as_child<Domain>(a1) , proto::as_child<Domain>(a2) , proto::as_child<Domain>(a3) , proto::as_child<Domain>(a4) , proto::as_child<Domain>(a5) , proto::as_child<Domain>(a6) , proto::as_child<Domain>(a7) | |
}; | |
return that; | |
} | |
}; | |
template<typename Expr , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7, typename This, typename Domain> | |
struct funop<Expr(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7), This, Domain> | |
: funop8< | |
typename detail::same_cv<Expr, This>::type | |
, Domain | |
, typename remove_reference<A0 >::type , typename remove_reference<A1 >::type , typename remove_reference<A2 >::type , typename remove_reference<A3 >::type , typename remove_reference<A4 >::type , typename remove_reference<A5 >::type , typename remove_reference<A6 >::type , typename remove_reference<A7 >::type | |
> | |
{}; | |
template<typename Expr, typename Domain , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8> | |
struct funop9 | |
{ | |
typedef typename proto::base_expr< | |
Domain | |
, tag::function | |
, list10< | |
Expr & | |
, typename proto::result_of::as_child<A0, Domain>::type , typename proto::result_of::as_child<A1, Domain>::type , typename proto::result_of::as_child<A2, Domain>::type , typename proto::result_of::as_child<A3, Domain>::type , typename proto::result_of::as_child<A4, Domain>::type , typename proto::result_of::as_child<A5, Domain>::type , typename proto::result_of::as_child<A6, Domain>::type , typename proto::result_of::as_child<A7, Domain>::type , typename proto::result_of::as_child<A8, Domain>::type | |
> | |
>::type type; | |
static type const call( | |
Expr &e | |
, A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 , A4 &a4 , A5 &a5 , A6 &a6 , A7 &a7 , A8 &a8 | |
) | |
{ | |
type that = { | |
e | |
, proto::as_child<Domain>(a0) , proto::as_child<Domain>(a1) , proto::as_child<Domain>(a2) , proto::as_child<Domain>(a3) , proto::as_child<Domain>(a4) , proto::as_child<Domain>(a5) , proto::as_child<Domain>(a6) , proto::as_child<Domain>(a7) , proto::as_child<Domain>(a8) | |
}; | |
return that; | |
} | |
}; | |
template<typename Expr , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8, typename This, typename Domain> | |
struct funop<Expr(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8), This, Domain> | |
: funop9< | |
typename detail::same_cv<Expr, This>::type | |
, Domain | |
, typename remove_reference<A0 >::type , typename remove_reference<A1 >::type , typename remove_reference<A2 >::type , typename remove_reference<A3 >::type , typename remove_reference<A4 >::type , typename remove_reference<A5 >::type , typename remove_reference<A6 >::type , typename remove_reference<A7 >::type , typename remove_reference<A8 >::type | |
> | |
{}; |