150 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			150 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /*============================================================================== | ||
|  |     Copyright (c) 2001-2010 Joel de Guzman | ||
|  |     Copyright (c) 2010 Eric Niebler | ||
|  |     Copyright (c) 2015 John Fletcher | ||
|  | 
 | ||
|  |     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) | ||
|  | ==============================================================================*/ | ||
|  | #ifndef BOOST_PHOENIX_FUNCTION_FUNCTION_HPP | ||
|  | #define BOOST_PHOENIX_FUNCTION_FUNCTION_HPP | ||
|  | 
 | ||
|  | #include <boost/phoenix/config.hpp> | ||
|  | #include <boost/phoenix/core/limits.hpp> | ||
|  | #include <boost/phoenix/core/detail/function_eval.hpp> | ||
|  | #include <boost/utility/result_of.hpp> | ||
|  | 
 | ||
|  | namespace boost { namespace phoenix | ||
|  | { | ||
|  |     ///////////////////////////////////////////////////////////////////////////// | ||
|  |     // Functions | ||
|  |     ///////////////////////////////////////////////////////////////////////////// | ||
|  | 
 | ||
|  |     namespace expression | ||
|  |     { | ||
|  | #if defined(BOOST_PHOENIX_NO_VARIADIC_FUNCTION) | ||
|  |         template <typename F, BOOST_PHOENIX_typename_A_void(BOOST_PHOENIX_ACTOR_LIMIT)> | ||
|  |         struct function | ||
|  |             : detail::expression::function_eval<F, BOOST_PHOENIX_A(BOOST_PHOENIX_ACTOR_LIMIT)> | ||
|  |         {}; | ||
|  | #else | ||
|  |       // TODO: | ||
|  | #endif | ||
|  |     } | ||
|  | 
 | ||
|  |     // functor which returns our lazy function call extension | ||
|  |     template<typename F> | ||
|  |     struct function | ||
|  |     { | ||
|  |         BOOST_CONSTEXPR function() | ||
|  |           : f() | ||
|  |         {} | ||
|  | 
 | ||
|  |         BOOST_CONSTEXPR function(F f_) | ||
|  |           : f(f_) | ||
|  |         {} | ||
|  | 
 | ||
|  |         template <typename Sig> | ||
|  |         struct result; | ||
|  | 
 | ||
|  | #if defined(BOOST_PHOENIX_NO_VARIADIC_FUNCTION) | ||
|  |         typename detail::expression::function_eval<F>::type const | ||
|  |         operator()() const | ||
|  |         { | ||
|  |             return detail::expression::function_eval<F>::make(f); | ||
|  |         } | ||
|  | 
 | ||
|  |         // Bring in the rest | ||
|  |         #include <boost/phoenix/function/detail/cpp03/function_operator.hpp> | ||
|  | 
 | ||
|  |       // Solves the result problem for F(X) | ||
|  |         template <typename This, typename A0> | ||
|  |         struct result<This(A0)> | ||
|  |           : detail::expression::function_eval<F, | ||
|  |             typename boost::remove_reference<A0>::type> | ||
|  |         {}; | ||
|  |       // Solves the result problem for F(X,Y) | ||
|  |         template <typename This, typename A0, typename A1> | ||
|  |         struct result<This(A0,A1)> | ||
|  |           : detail::expression::function_eval<F, | ||
|  |             typename boost::remove_reference<A0>::type, | ||
|  |             typename boost::remove_reference<A1>::type> | ||
|  |         {}; | ||
|  |       // Solves the result problem for F(X,Y,Z) | ||
|  |         template <typename This, typename A0, typename A1, typename A2> | ||
|  |         struct result<This(A0,A1,A2)> | ||
|  |           : detail::expression::function_eval<F, | ||
|  |             typename boost::remove_reference<A0>::type, | ||
|  |             typename boost::remove_reference<A1>::type, | ||
|  |             typename boost::remove_reference<A2>::type> | ||
|  |         {}; | ||
|  | 
 | ||
|  |       // Solves the result problem for F(W,X,Y,Z) | ||
|  |       template <typename This, typename A0, typename A1, | ||
|  |                                typename A2, typename A3> | ||
|  |       struct result<This(A0,A1,A2,A3)> | ||
|  |           : detail::expression::function_eval<F, | ||
|  |             typename boost::remove_reference<A0>::type, | ||
|  |             typename boost::remove_reference<A1>::type, | ||
|  |             typename boost::remove_reference<A2>::type, | ||
|  |             typename boost::remove_reference<A3>::type> | ||
|  |          {}; | ||
|  | 
 | ||
|  |       // Solves the result problem for F(V,W,X,Y,Z) | ||
|  |       template <typename This, typename A0, typename A1, | ||
|  |                 typename A2, typename A3,typename A4> | ||
|  |       struct result<This(A0,A1,A2,A3,A4)> | ||
|  |           : detail::expression::function_eval<F, | ||
|  |             typename boost::remove_reference<A0>::type, | ||
|  |             typename boost::remove_reference<A1>::type, | ||
|  |             typename boost::remove_reference<A2>::type, | ||
|  |             typename boost::remove_reference<A3>::type, | ||
|  |             typename boost::remove_reference<A4>::type> | ||
|  |        {}; | ||
|  | 
 | ||
|  |       // Solves the result problem for F(U,V,W,X,Y,Z) | ||
|  |       template <typename This, typename A0, typename A1, | ||
|  |                 typename A2, typename A3,typename A4, | ||
|  |                 typename A5> | ||
|  |       struct result<This(A0,A1,A2,A3,A4,A5)> | ||
|  |           : detail::expression::function_eval<F, | ||
|  |             typename boost::remove_reference<A0>::type, | ||
|  |             typename boost::remove_reference<A1>::type, | ||
|  |             typename boost::remove_reference<A2>::type, | ||
|  |             typename boost::remove_reference<A3>::type, | ||
|  |             typename boost::remove_reference<A4>::type, | ||
|  |             typename boost::remove_reference<A5>::type> | ||
|  |        {}; | ||
|  | 
 | ||
|  |       // Solves the result problem for F(T,U,V,W,X,Y,Z) | ||
|  |       template <typename This, typename A0, typename A1, | ||
|  |                 typename A2, typename A3,typename A4, | ||
|  |                 typename A5, typename A6> | ||
|  |       struct result<This(A0,A1,A2,A3,A4,A5,A6)> | ||
|  |           : detail::expression::function_eval<F, | ||
|  |             typename boost::remove_reference<A0>::type, | ||
|  |             typename boost::remove_reference<A1>::type, | ||
|  |             typename boost::remove_reference<A2>::type, | ||
|  |             typename boost::remove_reference<A3>::type, | ||
|  |             typename boost::remove_reference<A4>::type, | ||
|  |             typename boost::remove_reference<A5>::type, | ||
|  |             typename boost::remove_reference<A6>::type> | ||
|  |        {}; | ||
|  | #else | ||
|  |       // TODO: | ||
|  | #endif | ||
|  | 
 | ||
|  |         F f; | ||
|  |     }; | ||
|  | } | ||
|  | 
 | ||
|  |     template<typename F> | ||
|  |     struct result_of<phoenix::function<F>()> | ||
|  |       : phoenix::detail::expression::function_eval<F> | ||
|  |     {}; | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | #endif | ||
|  | 
 |