368 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			368 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								    ///////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								    // 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;
							 | 
						||
| 
								 | 
							
								        BOOST_FORCEINLINE
							 | 
						||
| 
								 | 
							
								        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;
							 | 
						||
| 
								 | 
							
								        BOOST_FORCEINLINE
							 | 
						||
| 
								 | 
							
								        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;
							 | 
						||
| 
								 | 
							
								        BOOST_FORCEINLINE
							 | 
						||
| 
								 | 
							
								        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;
							 | 
						||
| 
								 | 
							
								        BOOST_FORCEINLINE
							 | 
						||
| 
								 | 
							
								        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;
							 | 
						||
| 
								 | 
							
								        BOOST_FORCEINLINE
							 | 
						||
| 
								 | 
							
								        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;
							 | 
						||
| 
								 | 
							
								        BOOST_FORCEINLINE
							 | 
						||
| 
								 | 
							
								        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;
							 | 
						||
| 
								 | 
							
								        BOOST_FORCEINLINE
							 | 
						||
| 
								 | 
							
								        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;
							 | 
						||
| 
								 | 
							
								        BOOST_FORCEINLINE
							 | 
						||
| 
								 | 
							
								        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;
							 | 
						||
| 
								 | 
							
								        BOOST_FORCEINLINE
							 | 
						||
| 
								 | 
							
								        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;
							 | 
						||
| 
								 | 
							
								        BOOST_FORCEINLINE
							 | 
						||
| 
								 | 
							
								        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
							 | 
						||
| 
								 | 
							
								        >
							 | 
						||
| 
								 | 
							
								    {};
							 |