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 | ||
|  |         > | ||
|  |     {}; |