Chris@16: /*============================================================================== Chris@16: Copyright (c) 2005-2010 Joel de Guzman Chris@16: Copyright (c) 2010 Thomas Heller Chris@16: Chris@16: Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: ==============================================================================*/ Chris@16: namespace boost { namespace phoenix Chris@16: { Chris@101: namespace expression { template struct mem_ptr : expr {}; } namespace rule { struct mem_ptr : expression:: mem_ptr {}; } template struct meta_grammar::case_ : enable_rule {}; namespace functional { typedef proto::functional::make_expr make_mem_ptr; } namespace result_of { template struct make_mem_ptr : boost::result_of< functional:: make_mem_ptr( Lhs, Rhs ) > {}; } template inline typename result_of::make_mem_ptr::type make_mem_ptr(Lhs const & lhs, Rhs const & rhs) { return functional::make_mem_ptr()(lhs, rhs); } Chris@16: template<> Chris@16: struct phoenix_generator::case_ Chris@16: : proto::or_< Chris@16: proto::when< Chris@16: proto::and_< Chris@16: proto::mem_ptr > Chris@16: , proto::if_ > >()> Chris@16: > Chris@16: , proto::call)> Chris@16: > Chris@16: , proto::otherwise< Chris@16: proto::call(proto::_)> Chris@16: > Chris@16: > Chris@16: {}; Chris@16: namespace result_of Chris@16: { Chris@16: template < Chris@16: typename Context Chris@16: , typename A0 = void , typename A1 = void , typename A2 = void , typename A3 = void , typename A4 = void , typename A5 = void , typename A6 = void , typename A7 = void , typename A8 = void , typename A9 = void Chris@16: , typename Dummy = void Chris@16: > Chris@16: struct mem_fun_ptr_eval; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct mem_fun_ptr_eval Chris@16: { Chris@16: typedef typename evaluator::impl< A0 , Context , proto::empty_env >::result_type child0; typedef typename evaluator::impl< A1 , Context , proto::empty_env >::result_type child1; Chris@16: typedef Chris@16: typename boost::result_of< Chris@16: child1( Chris@16: child1 Chris@16: ) Chris@16: >::type Chris@16: type; Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct mem_fun_ptr_eval Chris@16: { Chris@16: typedef typename evaluator::impl< A0 , Context , proto::empty_env >::result_type child0; typedef typename evaluator::impl< A1 , Context , proto::empty_env >::result_type child1; typedef typename evaluator::impl< A2 , Context , proto::empty_env >::result_type child2; Chris@16: typedef Chris@16: typename boost::result_of< Chris@16: child1( Chris@16: child1 , child2 Chris@16: ) Chris@16: >::type Chris@16: type; Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct mem_fun_ptr_eval Chris@16: { Chris@16: typedef typename evaluator::impl< A0 , Context , proto::empty_env >::result_type child0; typedef typename evaluator::impl< A1 , Context , proto::empty_env >::result_type child1; typedef typename evaluator::impl< A2 , Context , proto::empty_env >::result_type child2; typedef typename evaluator::impl< A3 , Context , proto::empty_env >::result_type child3; Chris@16: typedef Chris@16: typename boost::result_of< Chris@16: child1( Chris@16: child1 , child2 , child3 Chris@16: ) Chris@16: >::type Chris@16: type; Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct mem_fun_ptr_eval Chris@16: { Chris@16: typedef typename evaluator::impl< A0 , Context , proto::empty_env >::result_type child0; typedef typename evaluator::impl< A1 , Context , proto::empty_env >::result_type child1; typedef typename evaluator::impl< A2 , Context , proto::empty_env >::result_type child2; typedef typename evaluator::impl< A3 , Context , proto::empty_env >::result_type child3; typedef typename evaluator::impl< A4 , Context , proto::empty_env >::result_type child4; Chris@16: typedef Chris@16: typename boost::result_of< Chris@16: child1( Chris@16: child1 , child2 , child3 , child4 Chris@16: ) Chris@16: >::type Chris@16: type; Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct mem_fun_ptr_eval Chris@16: { Chris@16: typedef typename evaluator::impl< A0 , Context , proto::empty_env >::result_type child0; typedef typename evaluator::impl< A1 , Context , proto::empty_env >::result_type child1; typedef typename evaluator::impl< A2 , Context , proto::empty_env >::result_type child2; typedef typename evaluator::impl< A3 , Context , proto::empty_env >::result_type child3; typedef typename evaluator::impl< A4 , Context , proto::empty_env >::result_type child4; typedef typename evaluator::impl< A5 , Context , proto::empty_env >::result_type child5; Chris@16: typedef Chris@16: typename boost::result_of< Chris@16: child1( Chris@16: child1 , child2 , child3 , child4 , child5 Chris@16: ) Chris@16: >::type Chris@16: type; Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct mem_fun_ptr_eval Chris@16: { Chris@16: typedef typename evaluator::impl< A0 , Context , proto::empty_env >::result_type child0; typedef typename evaluator::impl< A1 , Context , proto::empty_env >::result_type child1; typedef typename evaluator::impl< A2 , Context , proto::empty_env >::result_type child2; typedef typename evaluator::impl< A3 , Context , proto::empty_env >::result_type child3; typedef typename evaluator::impl< A4 , Context , proto::empty_env >::result_type child4; typedef typename evaluator::impl< A5 , Context , proto::empty_env >::result_type child5; typedef typename evaluator::impl< A6 , Context , proto::empty_env >::result_type child6; Chris@16: typedef Chris@16: typename boost::result_of< Chris@16: child1( Chris@16: child1 , child2 , child3 , child4 , child5 , child6 Chris@16: ) Chris@16: >::type Chris@16: type; Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct mem_fun_ptr_eval Chris@16: { Chris@16: typedef typename evaluator::impl< A0 , Context , proto::empty_env >::result_type child0; typedef typename evaluator::impl< A1 , Context , proto::empty_env >::result_type child1; typedef typename evaluator::impl< A2 , Context , proto::empty_env >::result_type child2; typedef typename evaluator::impl< A3 , Context , proto::empty_env >::result_type child3; typedef typename evaluator::impl< A4 , Context , proto::empty_env >::result_type child4; typedef typename evaluator::impl< A5 , Context , proto::empty_env >::result_type child5; typedef typename evaluator::impl< A6 , Context , proto::empty_env >::result_type child6; typedef typename evaluator::impl< A7 , Context , proto::empty_env >::result_type child7; Chris@16: typedef Chris@16: typename boost::result_of< Chris@16: child1( Chris@16: child1 , child2 , child3 , child4 , child5 , child6 , child7 Chris@16: ) Chris@16: >::type Chris@16: type; Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct mem_fun_ptr_eval Chris@16: { Chris@16: typedef typename evaluator::impl< A0 , Context , proto::empty_env >::result_type child0; typedef typename evaluator::impl< A1 , Context , proto::empty_env >::result_type child1; typedef typename evaluator::impl< A2 , Context , proto::empty_env >::result_type child2; typedef typename evaluator::impl< A3 , Context , proto::empty_env >::result_type child3; typedef typename evaluator::impl< A4 , Context , proto::empty_env >::result_type child4; typedef typename evaluator::impl< A5 , Context , proto::empty_env >::result_type child5; typedef typename evaluator::impl< A6 , Context , proto::empty_env >::result_type child6; typedef typename evaluator::impl< A7 , Context , proto::empty_env >::result_type child7; typedef typename evaluator::impl< A8 , Context , proto::empty_env >::result_type child8; Chris@16: typedef Chris@16: typename boost::result_of< Chris@16: child1( Chris@16: child1 , child2 , child3 , child4 , child5 , child6 , child7 , child8 Chris@16: ) Chris@16: >::type Chris@16: type; Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct mem_fun_ptr_eval Chris@16: { Chris@16: typedef typename evaluator::impl< A0 , Context , proto::empty_env >::result_type child0; typedef typename evaluator::impl< A1 , Context , proto::empty_env >::result_type child1; typedef typename evaluator::impl< A2 , Context , proto::empty_env >::result_type child2; typedef typename evaluator::impl< A3 , Context , proto::empty_env >::result_type child3; typedef typename evaluator::impl< A4 , Context , proto::empty_env >::result_type child4; typedef typename evaluator::impl< A5 , Context , proto::empty_env >::result_type child5; typedef typename evaluator::impl< A6 , Context , proto::empty_env >::result_type child6; typedef typename evaluator::impl< A7 , Context , proto::empty_env >::result_type child7; typedef typename evaluator::impl< A8 , Context , proto::empty_env >::result_type child8; typedef typename evaluator::impl< A9 , Context , proto::empty_env >::result_type child9; Chris@16: typedef Chris@16: typename boost::result_of< Chris@16: child1( Chris@16: child1 , child2 , child3 , child4 , child5 , child6 , child7 , child8 , child9 Chris@16: ) Chris@16: >::type Chris@16: type; Chris@16: }; Chris@16: } Chris@16: struct mem_fun_ptr_eval Chris@16: { Chris@16: template Chris@16: struct result; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct result Chris@16: : result Chris@16: {}; Chris@16: template Chris@16: struct result Chris@16: : result_of::mem_fun_ptr_eval Chris@16: {}; Chris@16: template Chris@16: typename result_of::mem_fun_ptr_eval::type Chris@16: operator()( Chris@16: A0 const& a0 , A1 const& a1 Chris@16: , Context const & ctx Chris@16: ) const Chris@16: { Chris@16: return Chris@16: ( Chris@16: get_pointer(boost::phoenix::eval(a0, ctx)) Chris@16: ->*boost::phoenix::eval(a1, ctx) Chris@16: )( Chris@16: Chris@16: ); Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct result Chris@16: : result Chris@16: {}; Chris@16: template Chris@16: struct result Chris@16: : result_of::mem_fun_ptr_eval Chris@16: {}; Chris@16: template Chris@16: typename result_of::mem_fun_ptr_eval::type Chris@16: operator()( Chris@16: A0 const& a0 , A1 const& a1 , A2 const& a2 Chris@16: , Context const & ctx Chris@16: ) const Chris@16: { Chris@16: return Chris@16: ( Chris@16: get_pointer(boost::phoenix::eval(a0, ctx)) Chris@16: ->*boost::phoenix::eval(a1, ctx) Chris@16: )( Chris@16: boost::phoenix::eval(a2, ctx) Chris@16: ); Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct result Chris@16: : result Chris@16: {}; Chris@16: template Chris@16: struct result Chris@16: : result_of::mem_fun_ptr_eval Chris@16: {}; Chris@16: template Chris@16: typename result_of::mem_fun_ptr_eval::type Chris@16: operator()( Chris@16: A0 const& a0 , A1 const& a1 , A2 const& a2 , A3 const& a3 Chris@16: , Context const & ctx Chris@16: ) const Chris@16: { Chris@16: return Chris@16: ( Chris@16: get_pointer(boost::phoenix::eval(a0, ctx)) Chris@16: ->*boost::phoenix::eval(a1, ctx) Chris@16: )( Chris@16: boost::phoenix::eval(a2, ctx) , boost::phoenix::eval(a3, ctx) Chris@16: ); Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct result Chris@16: : result Chris@16: {}; Chris@16: template Chris@16: struct result Chris@16: : result_of::mem_fun_ptr_eval Chris@16: {}; Chris@16: template Chris@16: typename result_of::mem_fun_ptr_eval::type Chris@16: operator()( Chris@16: A0 const& a0 , A1 const& a1 , A2 const& a2 , A3 const& a3 , A4 const& a4 Chris@16: , Context const & ctx Chris@16: ) const Chris@16: { Chris@16: return Chris@16: ( Chris@16: get_pointer(boost::phoenix::eval(a0, ctx)) Chris@16: ->*boost::phoenix::eval(a1, ctx) Chris@16: )( Chris@16: boost::phoenix::eval(a2, ctx) , boost::phoenix::eval(a3, ctx) , boost::phoenix::eval(a4, ctx) Chris@16: ); Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct result Chris@16: : result Chris@16: {}; Chris@16: template Chris@16: struct result Chris@16: : result_of::mem_fun_ptr_eval Chris@16: {}; Chris@16: template Chris@16: typename result_of::mem_fun_ptr_eval::type Chris@16: operator()( Chris@16: A0 const& a0 , A1 const& a1 , A2 const& a2 , A3 const& a3 , A4 const& a4 , A5 const& a5 Chris@16: , Context const & ctx Chris@16: ) const Chris@16: { Chris@16: return Chris@16: ( Chris@16: get_pointer(boost::phoenix::eval(a0, ctx)) Chris@16: ->*boost::phoenix::eval(a1, ctx) Chris@16: )( Chris@16: boost::phoenix::eval(a2, ctx) , boost::phoenix::eval(a3, ctx) , boost::phoenix::eval(a4, ctx) , boost::phoenix::eval(a5, ctx) Chris@16: ); Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct result Chris@16: : result Chris@16: {}; Chris@16: template Chris@16: struct result Chris@16: : result_of::mem_fun_ptr_eval Chris@16: {}; Chris@16: template Chris@16: typename result_of::mem_fun_ptr_eval::type Chris@16: operator()( Chris@16: A0 const& a0 , A1 const& a1 , A2 const& a2 , A3 const& a3 , A4 const& a4 , A5 const& a5 , A6 const& a6 Chris@16: , Context const & ctx Chris@16: ) const Chris@16: { Chris@16: return Chris@16: ( Chris@16: get_pointer(boost::phoenix::eval(a0, ctx)) Chris@16: ->*boost::phoenix::eval(a1, ctx) Chris@16: )( Chris@16: boost::phoenix::eval(a2, ctx) , boost::phoenix::eval(a3, ctx) , boost::phoenix::eval(a4, ctx) , boost::phoenix::eval(a5, ctx) , boost::phoenix::eval(a6, ctx) Chris@16: ); Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct result Chris@16: : result Chris@16: {}; Chris@16: template Chris@16: struct result Chris@16: : result_of::mem_fun_ptr_eval Chris@16: {}; Chris@16: template Chris@16: typename result_of::mem_fun_ptr_eval::type Chris@16: operator()( Chris@16: A0 const& a0 , A1 const& a1 , A2 const& a2 , A3 const& a3 , A4 const& a4 , A5 const& a5 , A6 const& a6 , A7 const& a7 Chris@16: , Context const & ctx Chris@16: ) const Chris@16: { Chris@16: return Chris@16: ( Chris@16: get_pointer(boost::phoenix::eval(a0, ctx)) Chris@16: ->*boost::phoenix::eval(a1, ctx) Chris@16: )( Chris@16: boost::phoenix::eval(a2, ctx) , boost::phoenix::eval(a3, ctx) , boost::phoenix::eval(a4, ctx) , boost::phoenix::eval(a5, ctx) , boost::phoenix::eval(a6, ctx) , boost::phoenix::eval(a7, ctx) Chris@16: ); Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct result Chris@16: : result Chris@16: {}; Chris@16: template Chris@16: struct result Chris@16: : result_of::mem_fun_ptr_eval Chris@16: {}; Chris@16: template Chris@16: typename result_of::mem_fun_ptr_eval::type Chris@16: operator()( Chris@16: A0 const& a0 , A1 const& a1 , A2 const& a2 , A3 const& a3 , A4 const& a4 , A5 const& a5 , A6 const& a6 , A7 const& a7 , A8 const& a8 Chris@16: , Context const & ctx Chris@16: ) const Chris@16: { Chris@16: return Chris@16: ( Chris@16: get_pointer(boost::phoenix::eval(a0, ctx)) Chris@16: ->*boost::phoenix::eval(a1, ctx) Chris@16: )( Chris@16: boost::phoenix::eval(a2, ctx) , boost::phoenix::eval(a3, ctx) , boost::phoenix::eval(a4, ctx) , boost::phoenix::eval(a5, ctx) , boost::phoenix::eval(a6, ctx) , boost::phoenix::eval(a7, ctx) , boost::phoenix::eval(a8, ctx) Chris@16: ); Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct result Chris@16: : result Chris@16: {}; Chris@16: template Chris@16: struct result Chris@16: : result_of::mem_fun_ptr_eval Chris@16: {}; Chris@16: template Chris@16: typename result_of::mem_fun_ptr_eval::type Chris@16: operator()( Chris@16: A0 const& a0 , A1 const& a1 , A2 const& a2 , A3 const& a3 , A4 const& a4 , A5 const& a5 , A6 const& a6 , A7 const& a7 , A8 const& a8 , A9 const& a9 Chris@16: , Context const & ctx Chris@16: ) const Chris@16: { Chris@16: return Chris@16: ( Chris@16: get_pointer(boost::phoenix::eval(a0, ctx)) Chris@16: ->*boost::phoenix::eval(a1, ctx) Chris@16: )( Chris@16: boost::phoenix::eval(a2, ctx) , boost::phoenix::eval(a3, ctx) , boost::phoenix::eval(a4, ctx) , boost::phoenix::eval(a5, ctx) , boost::phoenix::eval(a6, ctx) , boost::phoenix::eval(a7, ctx) , boost::phoenix::eval(a8, ctx) , boost::phoenix::eval(a9, ctx) Chris@16: ); Chris@16: } Chris@16: Chris@16: }; Chris@16: template Chris@16: struct default_actions::when Chris@16: : call Chris@16: {}; Chris@16: }}