1487 lines
		
	
	
		
			52 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			1487 lines
		
	
	
		
			52 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   |     /////////////////////////////////////////////////////////////////////////////// | ||
|  |     /// \file traits.hpp | ||
|  |     /// Definitions of proto::function, proto::nary_expr and proto::result_of::child_c | ||
|  |     // | ||
|  |     //  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) | ||
|  |         namespace result_of | ||
|  |         { | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr, 0> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child0 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child0>::value_type type; | ||
|  |             }; | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr &, 0> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child0 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child0>::reference type; | ||
|  |                  | ||
|  |                  | ||
|  |                 BOOST_FORCEINLINE | ||
|  |                 static type call(Expr &e) | ||
|  |                 { | ||
|  |                     return e.proto_base().child0; | ||
|  |                 } | ||
|  |             }; | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr const &, 0> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child0 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child0>::const_reference type; | ||
|  |                  | ||
|  |                  | ||
|  |                 BOOST_FORCEINLINE | ||
|  |                 static type call(Expr const &e) | ||
|  |                 { | ||
|  |                     return e.proto_base().child0; | ||
|  |                 } | ||
|  |             }; | ||
|  |         } | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |         template<typename A0> | ||
|  |         struct function | ||
|  |         < | ||
|  |             A0 | ||
|  |             , void , void , void , void , void , void , void , void , void | ||
|  |         > | ||
|  |           : proto::transform< | ||
|  |                 function< | ||
|  |                     A0 | ||
|  |                     , void , void , void , void , void , void , void , void , void | ||
|  |                 > | ||
|  |               , int | ||
|  |             > | ||
|  |         { | ||
|  |             typedef proto::expr<proto::tag::function, list1<A0>, 1> type; | ||
|  |             typedef proto::basic_expr<proto::tag::function, list1<A0>, 1> proto_grammar; | ||
|  |             template<typename Expr, typename State, typename Data> | ||
|  |             struct impl | ||
|  |               : detail::pass_through_impl<function, deduce_domain, Expr, State, Data> | ||
|  |             {}; | ||
|  |              | ||
|  |             typedef proto::tag::function proto_tag; | ||
|  |             typedef A0 proto_child0; | ||
|  |             typedef detail::if_vararg<A0> proto_child1; typedef detail::if_vararg<A0> proto_child2; typedef detail::if_vararg<A0> proto_child3; typedef detail::if_vararg<A0> proto_child4; typedef detail::if_vararg<A0> proto_child5; typedef detail::if_vararg<A0> proto_child6; typedef detail::if_vararg<A0> proto_child7; typedef detail::if_vararg<A0> proto_child8; typedef detail::if_vararg<A0> proto_child9; | ||
|  |         }; | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |         template<typename Tag , typename A0> | ||
|  |         struct nary_expr | ||
|  |         < | ||
|  |             Tag | ||
|  |             , A0 | ||
|  |             , void , void , void , void , void , void , void , void , void | ||
|  |         > | ||
|  |           : proto::transform< | ||
|  |                 nary_expr< | ||
|  |                     Tag | ||
|  |                     , A0 | ||
|  |                     , void , void , void , void , void , void , void , void , void | ||
|  |                 > | ||
|  |               , int | ||
|  |             > | ||
|  |         { | ||
|  |             typedef proto::expr<Tag, list1<A0>, 1> type; | ||
|  |             typedef proto::basic_expr<Tag, list1<A0>, 1> proto_grammar; | ||
|  |             template<typename Expr, typename State, typename Data> | ||
|  |             struct impl | ||
|  |               : detail::pass_through_impl<nary_expr, deduce_domain, Expr, State, Data> | ||
|  |             {}; | ||
|  |              | ||
|  |             typedef Tag proto_tag; | ||
|  |             typedef A0 proto_child0; | ||
|  |             typedef detail::if_vararg<A0> proto_child1; typedef detail::if_vararg<A0> proto_child2; typedef detail::if_vararg<A0> proto_child3; typedef detail::if_vararg<A0> proto_child4; typedef detail::if_vararg<A0> proto_child5; typedef detail::if_vararg<A0> proto_child6; typedef detail::if_vararg<A0> proto_child7; typedef detail::if_vararg<A0> proto_child8; typedef detail::if_vararg<A0> proto_child9; | ||
|  |         }; | ||
|  |         namespace detail | ||
|  |         { | ||
|  |             template< | ||
|  |                 template<typename> class T | ||
|  |               , typename A0 | ||
|  |             > | ||
|  |             struct is_callable_<T<A0> BOOST_PROTO_TEMPLATE_ARITY_PARAM(1)> | ||
|  |               : is_same<A0, callable> | ||
|  |             {}; | ||
|  |         } | ||
|  |         namespace result_of | ||
|  |         { | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr, 1> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child1 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child1>::value_type type; | ||
|  |             }; | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr &, 1> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child1 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child1>::reference type; | ||
|  |                  | ||
|  |                  | ||
|  |                 BOOST_FORCEINLINE | ||
|  |                 static type call(Expr &e) | ||
|  |                 { | ||
|  |                     return e.proto_base().child1; | ||
|  |                 } | ||
|  |             }; | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr const &, 1> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child1 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child1>::const_reference type; | ||
|  |                  | ||
|  |                  | ||
|  |                 BOOST_FORCEINLINE | ||
|  |                 static type call(Expr const &e) | ||
|  |                 { | ||
|  |                     return e.proto_base().child1; | ||
|  |                 } | ||
|  |             }; | ||
|  |         } | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |         template<typename A0 , typename A1> | ||
|  |         struct function | ||
|  |         < | ||
|  |             A0 , A1 | ||
|  |             , void , void , void , void , void , void , void , void | ||
|  |         > | ||
|  |           : proto::transform< | ||
|  |                 function< | ||
|  |                     A0 , A1 | ||
|  |                     , void , void , void , void , void , void , void , void | ||
|  |                 > | ||
|  |               , int | ||
|  |             > | ||
|  |         { | ||
|  |             typedef proto::expr<proto::tag::function, list2<A0 , A1>, 2> type; | ||
|  |             typedef proto::basic_expr<proto::tag::function, list2<A0 , A1>, 2> proto_grammar; | ||
|  |             template<typename Expr, typename State, typename Data> | ||
|  |             struct impl | ||
|  |               : detail::pass_through_impl<function, deduce_domain, Expr, State, Data> | ||
|  |             {}; | ||
|  |              | ||
|  |             typedef proto::tag::function proto_tag; | ||
|  |             typedef A0 proto_child0; typedef A1 proto_child1; | ||
|  |             typedef detail::if_vararg<A1> proto_child2; typedef detail::if_vararg<A1> proto_child3; typedef detail::if_vararg<A1> proto_child4; typedef detail::if_vararg<A1> proto_child5; typedef detail::if_vararg<A1> proto_child6; typedef detail::if_vararg<A1> proto_child7; typedef detail::if_vararg<A1> proto_child8; typedef detail::if_vararg<A1> proto_child9; | ||
|  |         }; | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |         template<typename Tag , typename A0 , typename A1> | ||
|  |         struct nary_expr | ||
|  |         < | ||
|  |             Tag | ||
|  |             , A0 , A1 | ||
|  |             , void , void , void , void , void , void , void , void | ||
|  |         > | ||
|  |           : proto::transform< | ||
|  |                 nary_expr< | ||
|  |                     Tag | ||
|  |                     , A0 , A1 | ||
|  |                     , void , void , void , void , void , void , void , void | ||
|  |                 > | ||
|  |               , int | ||
|  |             > | ||
|  |         { | ||
|  |             typedef proto::expr<Tag, list2<A0 , A1>, 2> type; | ||
|  |             typedef proto::basic_expr<Tag, list2<A0 , A1>, 2> proto_grammar; | ||
|  |             template<typename Expr, typename State, typename Data> | ||
|  |             struct impl | ||
|  |               : detail::pass_through_impl<nary_expr, deduce_domain, Expr, State, Data> | ||
|  |             {}; | ||
|  |              | ||
|  |             typedef Tag proto_tag; | ||
|  |             typedef A0 proto_child0; typedef A1 proto_child1; | ||
|  |             typedef detail::if_vararg<A1> proto_child2; typedef detail::if_vararg<A1> proto_child3; typedef detail::if_vararg<A1> proto_child4; typedef detail::if_vararg<A1> proto_child5; typedef detail::if_vararg<A1> proto_child6; typedef detail::if_vararg<A1> proto_child7; typedef detail::if_vararg<A1> proto_child8; typedef detail::if_vararg<A1> proto_child9; | ||
|  |         }; | ||
|  |         namespace detail | ||
|  |         { | ||
|  |             template< | ||
|  |                 template<typename , typename> class T | ||
|  |               , typename A0 , typename A1 | ||
|  |             > | ||
|  |             struct is_callable_<T<A0 , A1> BOOST_PROTO_TEMPLATE_ARITY_PARAM(2)> | ||
|  |               : is_same<A1, callable> | ||
|  |             {}; | ||
|  |         } | ||
|  |         namespace result_of | ||
|  |         { | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr, 2> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child2 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child2>::value_type type; | ||
|  |             }; | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr &, 2> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child2 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child2>::reference type; | ||
|  |                  | ||
|  |                  | ||
|  |                 BOOST_FORCEINLINE | ||
|  |                 static type call(Expr &e) | ||
|  |                 { | ||
|  |                     return e.proto_base().child2; | ||
|  |                 } | ||
|  |             }; | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr const &, 2> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child2 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child2>::const_reference type; | ||
|  |                  | ||
|  |                  | ||
|  |                 BOOST_FORCEINLINE | ||
|  |                 static type call(Expr const &e) | ||
|  |                 { | ||
|  |                     return e.proto_base().child2; | ||
|  |                 } | ||
|  |             }; | ||
|  |         } | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |         template<typename A0 , typename A1 , typename A2> | ||
|  |         struct function | ||
|  |         < | ||
|  |             A0 , A1 , A2 | ||
|  |             , void , void , void , void , void , void , void | ||
|  |         > | ||
|  |           : proto::transform< | ||
|  |                 function< | ||
|  |                     A0 , A1 , A2 | ||
|  |                     , void , void , void , void , void , void , void | ||
|  |                 > | ||
|  |               , int | ||
|  |             > | ||
|  |         { | ||
|  |             typedef proto::expr<proto::tag::function, list3<A0 , A1 , A2>, 3> type; | ||
|  |             typedef proto::basic_expr<proto::tag::function, list3<A0 , A1 , A2>, 3> proto_grammar; | ||
|  |             template<typename Expr, typename State, typename Data> | ||
|  |             struct impl | ||
|  |               : detail::pass_through_impl<function, deduce_domain, Expr, State, Data> | ||
|  |             {}; | ||
|  |              | ||
|  |             typedef proto::tag::function proto_tag; | ||
|  |             typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; | ||
|  |             typedef detail::if_vararg<A2> proto_child3; typedef detail::if_vararg<A2> proto_child4; typedef detail::if_vararg<A2> proto_child5; typedef detail::if_vararg<A2> proto_child6; typedef detail::if_vararg<A2> proto_child7; typedef detail::if_vararg<A2> proto_child8; typedef detail::if_vararg<A2> proto_child9; | ||
|  |         }; | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |         template<typename Tag , typename A0 , typename A1 , typename A2> | ||
|  |         struct nary_expr | ||
|  |         < | ||
|  |             Tag | ||
|  |             , A0 , A1 , A2 | ||
|  |             , void , void , void , void , void , void , void | ||
|  |         > | ||
|  |           : proto::transform< | ||
|  |                 nary_expr< | ||
|  |                     Tag | ||
|  |                     , A0 , A1 , A2 | ||
|  |                     , void , void , void , void , void , void , void | ||
|  |                 > | ||
|  |               , int | ||
|  |             > | ||
|  |         { | ||
|  |             typedef proto::expr<Tag, list3<A0 , A1 , A2>, 3> type; | ||
|  |             typedef proto::basic_expr<Tag, list3<A0 , A1 , A2>, 3> proto_grammar; | ||
|  |             template<typename Expr, typename State, typename Data> | ||
|  |             struct impl | ||
|  |               : detail::pass_through_impl<nary_expr, deduce_domain, Expr, State, Data> | ||
|  |             {}; | ||
|  |              | ||
|  |             typedef Tag proto_tag; | ||
|  |             typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; | ||
|  |             typedef detail::if_vararg<A2> proto_child3; typedef detail::if_vararg<A2> proto_child4; typedef detail::if_vararg<A2> proto_child5; typedef detail::if_vararg<A2> proto_child6; typedef detail::if_vararg<A2> proto_child7; typedef detail::if_vararg<A2> proto_child8; typedef detail::if_vararg<A2> proto_child9; | ||
|  |         }; | ||
|  |         namespace detail | ||
|  |         { | ||
|  |             template< | ||
|  |                 template<typename , typename , typename> class T | ||
|  |               , typename A0 , typename A1 , typename A2 | ||
|  |             > | ||
|  |             struct is_callable_<T<A0 , A1 , A2> BOOST_PROTO_TEMPLATE_ARITY_PARAM(3)> | ||
|  |               : is_same<A2, callable> | ||
|  |             {}; | ||
|  |         } | ||
|  |         namespace result_of | ||
|  |         { | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr, 3> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child3 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child3>::value_type type; | ||
|  |             }; | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr &, 3> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child3 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child3>::reference type; | ||
|  |                  | ||
|  |                  | ||
|  |                 BOOST_FORCEINLINE | ||
|  |                 static type call(Expr &e) | ||
|  |                 { | ||
|  |                     return e.proto_base().child3; | ||
|  |                 } | ||
|  |             }; | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr const &, 3> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child3 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child3>::const_reference type; | ||
|  |                  | ||
|  |                  | ||
|  |                 BOOST_FORCEINLINE | ||
|  |                 static type call(Expr const &e) | ||
|  |                 { | ||
|  |                     return e.proto_base().child3; | ||
|  |                 } | ||
|  |             }; | ||
|  |         } | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |         template<typename A0 , typename A1 , typename A2 , typename A3> | ||
|  |         struct function | ||
|  |         < | ||
|  |             A0 , A1 , A2 , A3 | ||
|  |             , void , void , void , void , void , void | ||
|  |         > | ||
|  |           : proto::transform< | ||
|  |                 function< | ||
|  |                     A0 , A1 , A2 , A3 | ||
|  |                     , void , void , void , void , void , void | ||
|  |                 > | ||
|  |               , int | ||
|  |             > | ||
|  |         { | ||
|  |             typedef proto::expr<proto::tag::function, list4<A0 , A1 , A2 , A3>, 4> type; | ||
|  |             typedef proto::basic_expr<proto::tag::function, list4<A0 , A1 , A2 , A3>, 4> proto_grammar; | ||
|  |             template<typename Expr, typename State, typename Data> | ||
|  |             struct impl | ||
|  |               : detail::pass_through_impl<function, deduce_domain, Expr, State, Data> | ||
|  |             {}; | ||
|  |              | ||
|  |             typedef proto::tag::function proto_tag; | ||
|  |             typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; | ||
|  |             typedef detail::if_vararg<A3> proto_child4; typedef detail::if_vararg<A3> proto_child5; typedef detail::if_vararg<A3> proto_child6; typedef detail::if_vararg<A3> proto_child7; typedef detail::if_vararg<A3> proto_child8; typedef detail::if_vararg<A3> proto_child9; | ||
|  |         }; | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |         template<typename Tag , typename A0 , typename A1 , typename A2 , typename A3> | ||
|  |         struct nary_expr | ||
|  |         < | ||
|  |             Tag | ||
|  |             , A0 , A1 , A2 , A3 | ||
|  |             , void , void , void , void , void , void | ||
|  |         > | ||
|  |           : proto::transform< | ||
|  |                 nary_expr< | ||
|  |                     Tag | ||
|  |                     , A0 , A1 , A2 , A3 | ||
|  |                     , void , void , void , void , void , void | ||
|  |                 > | ||
|  |               , int | ||
|  |             > | ||
|  |         { | ||
|  |             typedef proto::expr<Tag, list4<A0 , A1 , A2 , A3>, 4> type; | ||
|  |             typedef proto::basic_expr<Tag, list4<A0 , A1 , A2 , A3>, 4> proto_grammar; | ||
|  |             template<typename Expr, typename State, typename Data> | ||
|  |             struct impl | ||
|  |               : detail::pass_through_impl<nary_expr, deduce_domain, Expr, State, Data> | ||
|  |             {}; | ||
|  |              | ||
|  |             typedef Tag proto_tag; | ||
|  |             typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; | ||
|  |             typedef detail::if_vararg<A3> proto_child4; typedef detail::if_vararg<A3> proto_child5; typedef detail::if_vararg<A3> proto_child6; typedef detail::if_vararg<A3> proto_child7; typedef detail::if_vararg<A3> proto_child8; typedef detail::if_vararg<A3> proto_child9; | ||
|  |         }; | ||
|  |         namespace detail | ||
|  |         { | ||
|  |             template< | ||
|  |                 template<typename , typename , typename , typename> class T | ||
|  |               , typename A0 , typename A1 , typename A2 , typename A3 | ||
|  |             > | ||
|  |             struct is_callable_<T<A0 , A1 , A2 , A3> BOOST_PROTO_TEMPLATE_ARITY_PARAM(4)> | ||
|  |               : is_same<A3, callable> | ||
|  |             {}; | ||
|  |         } | ||
|  |         namespace result_of | ||
|  |         { | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr, 4> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child4 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child4>::value_type type; | ||
|  |             }; | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr &, 4> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child4 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child4>::reference type; | ||
|  |                  | ||
|  |                  | ||
|  |                 BOOST_FORCEINLINE | ||
|  |                 static type call(Expr &e) | ||
|  |                 { | ||
|  |                     return e.proto_base().child4; | ||
|  |                 } | ||
|  |             }; | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr const &, 4> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child4 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child4>::const_reference type; | ||
|  |                  | ||
|  |                  | ||
|  |                 BOOST_FORCEINLINE | ||
|  |                 static type call(Expr const &e) | ||
|  |                 { | ||
|  |                     return e.proto_base().child4; | ||
|  |                 } | ||
|  |             }; | ||
|  |         } | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |         template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4> | ||
|  |         struct function | ||
|  |         < | ||
|  |             A0 , A1 , A2 , A3 , A4 | ||
|  |             , void , void , void , void , void | ||
|  |         > | ||
|  |           : proto::transform< | ||
|  |                 function< | ||
|  |                     A0 , A1 , A2 , A3 , A4 | ||
|  |                     , void , void , void , void , void | ||
|  |                 > | ||
|  |               , int | ||
|  |             > | ||
|  |         { | ||
|  |             typedef proto::expr<proto::tag::function, list5<A0 , A1 , A2 , A3 , A4>, 5> type; | ||
|  |             typedef proto::basic_expr<proto::tag::function, list5<A0 , A1 , A2 , A3 , A4>, 5> proto_grammar; | ||
|  |             template<typename Expr, typename State, typename Data> | ||
|  |             struct impl | ||
|  |               : detail::pass_through_impl<function, deduce_domain, Expr, State, Data> | ||
|  |             {}; | ||
|  |              | ||
|  |             typedef proto::tag::function proto_tag; | ||
|  |             typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; | ||
|  |             typedef detail::if_vararg<A4> proto_child5; typedef detail::if_vararg<A4> proto_child6; typedef detail::if_vararg<A4> proto_child7; typedef detail::if_vararg<A4> proto_child8; typedef detail::if_vararg<A4> proto_child9; | ||
|  |         }; | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |         template<typename Tag , typename A0 , typename A1 , typename A2 , typename A3 , typename A4> | ||
|  |         struct nary_expr | ||
|  |         < | ||
|  |             Tag | ||
|  |             , A0 , A1 , A2 , A3 , A4 | ||
|  |             , void , void , void , void , void | ||
|  |         > | ||
|  |           : proto::transform< | ||
|  |                 nary_expr< | ||
|  |                     Tag | ||
|  |                     , A0 , A1 , A2 , A3 , A4 | ||
|  |                     , void , void , void , void , void | ||
|  |                 > | ||
|  |               , int | ||
|  |             > | ||
|  |         { | ||
|  |             typedef proto::expr<Tag, list5<A0 , A1 , A2 , A3 , A4>, 5> type; | ||
|  |             typedef proto::basic_expr<Tag, list5<A0 , A1 , A2 , A3 , A4>, 5> proto_grammar; | ||
|  |             template<typename Expr, typename State, typename Data> | ||
|  |             struct impl | ||
|  |               : detail::pass_through_impl<nary_expr, deduce_domain, Expr, State, Data> | ||
|  |             {}; | ||
|  |              | ||
|  |             typedef Tag proto_tag; | ||
|  |             typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; | ||
|  |             typedef detail::if_vararg<A4> proto_child5; typedef detail::if_vararg<A4> proto_child6; typedef detail::if_vararg<A4> proto_child7; typedef detail::if_vararg<A4> proto_child8; typedef detail::if_vararg<A4> proto_child9; | ||
|  |         }; | ||
|  |         namespace detail | ||
|  |         { | ||
|  |             template< | ||
|  |                 template<typename , typename , typename , typename , typename> class T | ||
|  |               , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 | ||
|  |             > | ||
|  |             struct is_callable_<T<A0 , A1 , A2 , A3 , A4> BOOST_PROTO_TEMPLATE_ARITY_PARAM(5)> | ||
|  |               : is_same<A4, callable> | ||
|  |             {}; | ||
|  |         } | ||
|  |         namespace result_of | ||
|  |         { | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr, 5> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child5 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child5>::value_type type; | ||
|  |             }; | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr &, 5> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child5 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child5>::reference type; | ||
|  |                  | ||
|  |                  | ||
|  |                 BOOST_FORCEINLINE | ||
|  |                 static type call(Expr &e) | ||
|  |                 { | ||
|  |                     return e.proto_base().child5; | ||
|  |                 } | ||
|  |             }; | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr const &, 5> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child5 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child5>::const_reference type; | ||
|  |                  | ||
|  |                  | ||
|  |                 BOOST_FORCEINLINE | ||
|  |                 static type call(Expr const &e) | ||
|  |                 { | ||
|  |                     return e.proto_base().child5; | ||
|  |                 } | ||
|  |             }; | ||
|  |         } | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |         template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5> | ||
|  |         struct function | ||
|  |         < | ||
|  |             A0 , A1 , A2 , A3 , A4 , A5 | ||
|  |             , void , void , void , void | ||
|  |         > | ||
|  |           : proto::transform< | ||
|  |                 function< | ||
|  |                     A0 , A1 , A2 , A3 , A4 , A5 | ||
|  |                     , void , void , void , void | ||
|  |                 > | ||
|  |               , int | ||
|  |             > | ||
|  |         { | ||
|  |             typedef proto::expr<proto::tag::function, list6<A0 , A1 , A2 , A3 , A4 , A5>, 6> type; | ||
|  |             typedef proto::basic_expr<proto::tag::function, list6<A0 , A1 , A2 , A3 , A4 , A5>, 6> proto_grammar; | ||
|  |             template<typename Expr, typename State, typename Data> | ||
|  |             struct impl | ||
|  |               : detail::pass_through_impl<function, deduce_domain, Expr, State, Data> | ||
|  |             {}; | ||
|  |              | ||
|  |             typedef proto::tag::function proto_tag; | ||
|  |             typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; | ||
|  |             typedef detail::if_vararg<A5> proto_child6; typedef detail::if_vararg<A5> proto_child7; typedef detail::if_vararg<A5> proto_child8; typedef detail::if_vararg<A5> proto_child9; | ||
|  |         }; | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |         template<typename Tag , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5> | ||
|  |         struct nary_expr | ||
|  |         < | ||
|  |             Tag | ||
|  |             , A0 , A1 , A2 , A3 , A4 , A5 | ||
|  |             , void , void , void , void | ||
|  |         > | ||
|  |           : proto::transform< | ||
|  |                 nary_expr< | ||
|  |                     Tag | ||
|  |                     , A0 , A1 , A2 , A3 , A4 , A5 | ||
|  |                     , void , void , void , void | ||
|  |                 > | ||
|  |               , int | ||
|  |             > | ||
|  |         { | ||
|  |             typedef proto::expr<Tag, list6<A0 , A1 , A2 , A3 , A4 , A5>, 6> type; | ||
|  |             typedef proto::basic_expr<Tag, list6<A0 , A1 , A2 , A3 , A4 , A5>, 6> proto_grammar; | ||
|  |             template<typename Expr, typename State, typename Data> | ||
|  |             struct impl | ||
|  |               : detail::pass_through_impl<nary_expr, deduce_domain, Expr, State, Data> | ||
|  |             {}; | ||
|  |              | ||
|  |             typedef Tag proto_tag; | ||
|  |             typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; | ||
|  |             typedef detail::if_vararg<A5> proto_child6; typedef detail::if_vararg<A5> proto_child7; typedef detail::if_vararg<A5> proto_child8; typedef detail::if_vararg<A5> proto_child9; | ||
|  |         }; | ||
|  |         namespace detail | ||
|  |         { | ||
|  |             template< | ||
|  |                 template<typename , typename , typename , typename , typename , typename> class T | ||
|  |               , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 | ||
|  |             > | ||
|  |             struct is_callable_<T<A0 , A1 , A2 , A3 , A4 , A5> BOOST_PROTO_TEMPLATE_ARITY_PARAM(6)> | ||
|  |               : is_same<A5, callable> | ||
|  |             {}; | ||
|  |         } | ||
|  |         namespace result_of | ||
|  |         { | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr, 6> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child6 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child6>::value_type type; | ||
|  |             }; | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr &, 6> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child6 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child6>::reference type; | ||
|  |                  | ||
|  |                  | ||
|  |                 BOOST_FORCEINLINE | ||
|  |                 static type call(Expr &e) | ||
|  |                 { | ||
|  |                     return e.proto_base().child6; | ||
|  |                 } | ||
|  |             }; | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr const &, 6> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child6 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child6>::const_reference type; | ||
|  |                  | ||
|  |                  | ||
|  |                 BOOST_FORCEINLINE | ||
|  |                 static type call(Expr const &e) | ||
|  |                 { | ||
|  |                     return e.proto_base().child6; | ||
|  |                 } | ||
|  |             }; | ||
|  |         } | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |         template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6> | ||
|  |         struct function | ||
|  |         < | ||
|  |             A0 , A1 , A2 , A3 , A4 , A5 , A6 | ||
|  |             , void , void , void | ||
|  |         > | ||
|  |           : proto::transform< | ||
|  |                 function< | ||
|  |                     A0 , A1 , A2 , A3 , A4 , A5 , A6 | ||
|  |                     , void , void , void | ||
|  |                 > | ||
|  |               , int | ||
|  |             > | ||
|  |         { | ||
|  |             typedef proto::expr<proto::tag::function, list7<A0 , A1 , A2 , A3 , A4 , A5 , A6>, 7> type; | ||
|  |             typedef proto::basic_expr<proto::tag::function, list7<A0 , A1 , A2 , A3 , A4 , A5 , A6>, 7> proto_grammar; | ||
|  |             template<typename Expr, typename State, typename Data> | ||
|  |             struct impl | ||
|  |               : detail::pass_through_impl<function, deduce_domain, Expr, State, Data> | ||
|  |             {}; | ||
|  |              | ||
|  |             typedef proto::tag::function proto_tag; | ||
|  |             typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; typedef A6 proto_child6; | ||
|  |             typedef detail::if_vararg<A6> proto_child7; typedef detail::if_vararg<A6> proto_child8; typedef detail::if_vararg<A6> proto_child9; | ||
|  |         }; | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |         template<typename Tag , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6> | ||
|  |         struct nary_expr | ||
|  |         < | ||
|  |             Tag | ||
|  |             , A0 , A1 , A2 , A3 , A4 , A5 , A6 | ||
|  |             , void , void , void | ||
|  |         > | ||
|  |           : proto::transform< | ||
|  |                 nary_expr< | ||
|  |                     Tag | ||
|  |                     , A0 , A1 , A2 , A3 , A4 , A5 , A6 | ||
|  |                     , void , void , void | ||
|  |                 > | ||
|  |               , int | ||
|  |             > | ||
|  |         { | ||
|  |             typedef proto::expr<Tag, list7<A0 , A1 , A2 , A3 , A4 , A5 , A6>, 7> type; | ||
|  |             typedef proto::basic_expr<Tag, list7<A0 , A1 , A2 , A3 , A4 , A5 , A6>, 7> proto_grammar; | ||
|  |             template<typename Expr, typename State, typename Data> | ||
|  |             struct impl | ||
|  |               : detail::pass_through_impl<nary_expr, deduce_domain, Expr, State, Data> | ||
|  |             {}; | ||
|  |              | ||
|  |             typedef Tag proto_tag; | ||
|  |             typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; typedef A6 proto_child6; | ||
|  |             typedef detail::if_vararg<A6> proto_child7; typedef detail::if_vararg<A6> proto_child8; typedef detail::if_vararg<A6> proto_child9; | ||
|  |         }; | ||
|  |         namespace detail | ||
|  |         { | ||
|  |             template< | ||
|  |                 template<typename , typename , typename , typename , typename , typename , typename> class T | ||
|  |               , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 | ||
|  |             > | ||
|  |             struct is_callable_<T<A0 , A1 , A2 , A3 , A4 , A5 , A6> BOOST_PROTO_TEMPLATE_ARITY_PARAM(7)> | ||
|  |               : is_same<A6, callable> | ||
|  |             {}; | ||
|  |         } | ||
|  |         namespace result_of | ||
|  |         { | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr, 7> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child7 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child7>::value_type type; | ||
|  |             }; | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr &, 7> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child7 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child7>::reference type; | ||
|  |                  | ||
|  |                  | ||
|  |                 BOOST_FORCEINLINE | ||
|  |                 static type call(Expr &e) | ||
|  |                 { | ||
|  |                     return e.proto_base().child7; | ||
|  |                 } | ||
|  |             }; | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr const &, 7> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child7 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child7>::const_reference type; | ||
|  |                  | ||
|  |                  | ||
|  |                 BOOST_FORCEINLINE | ||
|  |                 static type call(Expr const &e) | ||
|  |                 { | ||
|  |                     return e.proto_base().child7; | ||
|  |                 } | ||
|  |             }; | ||
|  |         } | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |         template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7> | ||
|  |         struct function | ||
|  |         < | ||
|  |             A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 | ||
|  |             , void , void | ||
|  |         > | ||
|  |           : proto::transform< | ||
|  |                 function< | ||
|  |                     A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 | ||
|  |                     , void , void | ||
|  |                 > | ||
|  |               , int | ||
|  |             > | ||
|  |         { | ||
|  |             typedef proto::expr<proto::tag::function, list8<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7>, 8> type; | ||
|  |             typedef proto::basic_expr<proto::tag::function, list8<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7>, 8> proto_grammar; | ||
|  |             template<typename Expr, typename State, typename Data> | ||
|  |             struct impl | ||
|  |               : detail::pass_through_impl<function, deduce_domain, Expr, State, Data> | ||
|  |             {}; | ||
|  |              | ||
|  |             typedef proto::tag::function proto_tag; | ||
|  |             typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; typedef A6 proto_child6; typedef A7 proto_child7; | ||
|  |             typedef detail::if_vararg<A7> proto_child8; typedef detail::if_vararg<A7> proto_child9; | ||
|  |         }; | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |         template<typename Tag , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7> | ||
|  |         struct nary_expr | ||
|  |         < | ||
|  |             Tag | ||
|  |             , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 | ||
|  |             , void , void | ||
|  |         > | ||
|  |           : proto::transform< | ||
|  |                 nary_expr< | ||
|  |                     Tag | ||
|  |                     , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 | ||
|  |                     , void , void | ||
|  |                 > | ||
|  |               , int | ||
|  |             > | ||
|  |         { | ||
|  |             typedef proto::expr<Tag, list8<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7>, 8> type; | ||
|  |             typedef proto::basic_expr<Tag, list8<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7>, 8> proto_grammar; | ||
|  |             template<typename Expr, typename State, typename Data> | ||
|  |             struct impl | ||
|  |               : detail::pass_through_impl<nary_expr, deduce_domain, Expr, State, Data> | ||
|  |             {}; | ||
|  |              | ||
|  |             typedef Tag proto_tag; | ||
|  |             typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; typedef A6 proto_child6; typedef A7 proto_child7; | ||
|  |             typedef detail::if_vararg<A7> proto_child8; typedef detail::if_vararg<A7> proto_child9; | ||
|  |         }; | ||
|  |         namespace detail | ||
|  |         { | ||
|  |             template< | ||
|  |                 template<typename , typename , typename , typename , typename , typename , typename , typename> class T | ||
|  |               , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 | ||
|  |             > | ||
|  |             struct is_callable_<T<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7> BOOST_PROTO_TEMPLATE_ARITY_PARAM(8)> | ||
|  |               : is_same<A7, callable> | ||
|  |             {}; | ||
|  |         } | ||
|  |         namespace result_of | ||
|  |         { | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr, 8> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child8 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child8>::value_type type; | ||
|  |             }; | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr &, 8> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child8 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child8>::reference type; | ||
|  |                  | ||
|  |                  | ||
|  |                 BOOST_FORCEINLINE | ||
|  |                 static type call(Expr &e) | ||
|  |                 { | ||
|  |                     return e.proto_base().child8; | ||
|  |                 } | ||
|  |             }; | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr const &, 8> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child8 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child8>::const_reference type; | ||
|  |                  | ||
|  |                  | ||
|  |                 BOOST_FORCEINLINE | ||
|  |                 static type call(Expr const &e) | ||
|  |                 { | ||
|  |                     return e.proto_base().child8; | ||
|  |                 } | ||
|  |             }; | ||
|  |         } | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |         template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8> | ||
|  |         struct function | ||
|  |         < | ||
|  |             A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 | ||
|  |             , void | ||
|  |         > | ||
|  |           : proto::transform< | ||
|  |                 function< | ||
|  |                     A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 | ||
|  |                     , void | ||
|  |                 > | ||
|  |               , int | ||
|  |             > | ||
|  |         { | ||
|  |             typedef proto::expr<proto::tag::function, list9<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8>, 9> type; | ||
|  |             typedef proto::basic_expr<proto::tag::function, list9<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8>, 9> proto_grammar; | ||
|  |             template<typename Expr, typename State, typename Data> | ||
|  |             struct impl | ||
|  |               : detail::pass_through_impl<function, deduce_domain, Expr, State, Data> | ||
|  |             {}; | ||
|  |              | ||
|  |             typedef proto::tag::function proto_tag; | ||
|  |             typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; typedef A6 proto_child6; typedef A7 proto_child7; typedef A8 proto_child8; | ||
|  |             typedef detail::if_vararg<A8> proto_child9; | ||
|  |         }; | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |         template<typename Tag , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8> | ||
|  |         struct nary_expr | ||
|  |         < | ||
|  |             Tag | ||
|  |             , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 | ||
|  |             , void | ||
|  |         > | ||
|  |           : proto::transform< | ||
|  |                 nary_expr< | ||
|  |                     Tag | ||
|  |                     , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 | ||
|  |                     , void | ||
|  |                 > | ||
|  |               , int | ||
|  |             > | ||
|  |         { | ||
|  |             typedef proto::expr<Tag, list9<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8>, 9> type; | ||
|  |             typedef proto::basic_expr<Tag, list9<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8>, 9> proto_grammar; | ||
|  |             template<typename Expr, typename State, typename Data> | ||
|  |             struct impl | ||
|  |               : detail::pass_through_impl<nary_expr, deduce_domain, Expr, State, Data> | ||
|  |             {}; | ||
|  |              | ||
|  |             typedef Tag proto_tag; | ||
|  |             typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; typedef A6 proto_child6; typedef A7 proto_child7; typedef A8 proto_child8; | ||
|  |             typedef detail::if_vararg<A8> proto_child9; | ||
|  |         }; | ||
|  |         namespace detail | ||
|  |         { | ||
|  |             template< | ||
|  |                 template<typename , typename , typename , typename , typename , typename , typename , typename , typename> class T | ||
|  |               , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 | ||
|  |             > | ||
|  |             struct is_callable_<T<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8> BOOST_PROTO_TEMPLATE_ARITY_PARAM(9)> | ||
|  |               : is_same<A8, callable> | ||
|  |             {}; | ||
|  |         } | ||
|  |         namespace result_of | ||
|  |         { | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr, 9> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child9 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child9>::value_type type; | ||
|  |             }; | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr &, 9> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child9 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child9>::reference type; | ||
|  |                  | ||
|  |                  | ||
|  |                 BOOST_FORCEINLINE | ||
|  |                 static type call(Expr &e) | ||
|  |                 { | ||
|  |                     return e.proto_base().child9; | ||
|  |                 } | ||
|  |             }; | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr const &, 9> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child9 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child9>::const_reference type; | ||
|  |                  | ||
|  |                  | ||
|  |                 BOOST_FORCEINLINE | ||
|  |                 static type call(Expr const &e) | ||
|  |                 { | ||
|  |                     return e.proto_base().child9; | ||
|  |                 } | ||
|  |             }; | ||
|  |         } | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |         template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9> | ||
|  |         struct function | ||
|  |           : proto::transform< | ||
|  |                 function< | ||
|  |                     A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9 | ||
|  |                      | ||
|  |                 > | ||
|  |               , int | ||
|  |             > | ||
|  |         { | ||
|  |             typedef proto::expr<proto::tag::function, list10<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9>, 10> type; | ||
|  |             typedef proto::basic_expr<proto::tag::function, list10<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9>, 10> proto_grammar; | ||
|  |             template<typename Expr, typename State, typename Data> | ||
|  |             struct impl | ||
|  |               : detail::pass_through_impl<function, deduce_domain, Expr, State, Data> | ||
|  |             {}; | ||
|  |              | ||
|  |             typedef proto::tag::function proto_tag; | ||
|  |             typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; typedef A6 proto_child6; typedef A7 proto_child7; typedef A8 proto_child8; typedef A9 proto_child9; | ||
|  |              | ||
|  |         }; | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |          | ||
|  |         template<typename Tag , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9> | ||
|  |         struct nary_expr | ||
|  |           : proto::transform< | ||
|  |                 nary_expr< | ||
|  |                     Tag | ||
|  |                     , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9 | ||
|  |                      | ||
|  |                 > | ||
|  |               , int | ||
|  |             > | ||
|  |         { | ||
|  |             typedef proto::expr<Tag, list10<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9>, 10> type; | ||
|  |             typedef proto::basic_expr<Tag, list10<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9>, 10> proto_grammar; | ||
|  |             template<typename Expr, typename State, typename Data> | ||
|  |             struct impl | ||
|  |               : detail::pass_through_impl<nary_expr, deduce_domain, Expr, State, Data> | ||
|  |             {}; | ||
|  |              | ||
|  |             typedef Tag proto_tag; | ||
|  |             typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; typedef A6 proto_child6; typedef A7 proto_child7; typedef A8 proto_child8; typedef A9 proto_child9; | ||
|  |              | ||
|  |         }; | ||
|  |         namespace detail | ||
|  |         { | ||
|  |             template< | ||
|  |                 template<typename , typename , typename , typename , typename , typename , typename , typename , typename , typename> class T | ||
|  |               , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 | ||
|  |             > | ||
|  |             struct is_callable_<T<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9> BOOST_PROTO_TEMPLATE_ARITY_PARAM(10)> | ||
|  |               : is_same<A9, callable> | ||
|  |             {}; | ||
|  |         } | ||
|  |         namespace result_of | ||
|  |         { | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |              | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr, 10> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child10 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child10>::value_type type; | ||
|  |             }; | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr &, 10> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child10 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child10>::reference type; | ||
|  |                  | ||
|  |                  | ||
|  |                 BOOST_FORCEINLINE | ||
|  |                 static type call(Expr &e) | ||
|  |                 { | ||
|  |                     return e.proto_base().child10; | ||
|  |                 } | ||
|  |             }; | ||
|  |             template<typename Expr> | ||
|  |             struct child_c<Expr const &, 10> | ||
|  |             { | ||
|  |                  | ||
|  |                 BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename Expr::proto_child10 value_type; | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                  | ||
|  |                 typedef typename detail::expr_traits<typename Expr::proto_child10>::const_reference type; | ||
|  |                  | ||
|  |                  | ||
|  |                 BOOST_FORCEINLINE | ||
|  |                 static type call(Expr const &e) | ||
|  |                 { | ||
|  |                     return e.proto_base().child10; | ||
|  |                 } | ||
|  |             }; | ||
|  |         } |