/////////////////////////////////////////////////////////////////////////////// /// \file function.hpp /// Proto transforms for applying a function object. // // Copyright 2007 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) #ifndef BOOST_PROTO_TRANSFORM_FUNCTION_HPP_EAN_06_23_2007 #define BOOST_PROTO_TRANSFORM_FUNCTION_HPP_EAN_06_23_2007 #include #include #include #include namespace boost { namespace proto { namespace transform { // Apply a function object, passing just Expr template struct function1 : Grammar { function1() {} template struct apply : boost::result_of< Function1( typename Grammar::template apply::type ) > {}; template static typename apply::type call(Expr const &expr, State const &state, Visitor &visitor) { return Function1()(Grammar::call(expr, state, visitor)); } }; // Apply a function object, passing Expr and State template struct function2 : Grammar { function2() {} template struct apply : boost::result_of< Function2( typename Grammar::template apply::type , State const & ) > {}; template static typename apply::type call(Expr const &expr, State const &state, Visitor &visitor) { return Function2()(Grammar::call(expr, state, visitor), state); } }; // Apply a function object, passing Expr, State and Visitor template struct function3 : Grammar { function3() {} template struct apply : boost::result_of< Function3( typename Grammar::template apply::type , State const & , Visitor & ) > {}; template static typename apply::type call(Expr const &expr, State const &state, Visitor &visitor) { return Function3()(Grammar::call(expr, state, visitor), state, visitor); } }; }}} namespace boost { namespace proto { template struct is_transform > : mpl::true_ {}; template struct is_transform > : mpl::true_ {}; template struct is_transform > : mpl::true_ {}; }} #endif