Chris@16: /*============================================================================= Chris@16: Copyright (c) 2005-2007 Dan Marsden Chris@16: Copyright (c) 2005-2007 Joel de Guzman 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: Chris@16: #ifndef PHOENIX_OPERATOR_MEMBER_HPP Chris@16: #define PHOENIX_OPERATOR_MEMBER_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: template class shared_ptr; Chris@16: template class scoped_ptr; Chris@16: Chris@16: namespace phoenix { Chris@16: namespace detail Chris@16: { Chris@16: template Chris@16: struct member_type; Chris@16: Chris@16: template Chris@16: struct member_type Chris@16: { Chris@16: typedef MemberType type; Chris@16: }; Chris@16: } Chris@16: Chris@16: namespace meta Chris@16: { Chris@16: template Chris@16: struct pointed_type; Chris@16: Chris@16: template Chris@16: struct pointed_type Chris@16: { Chris@16: typedef T type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct pointed_type > Chris@16: { Chris@16: typedef T type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct pointed_type > Chris@16: { Chris@16: typedef T type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct pointed_type > Chris@16: { Chris@16: typedef T type; Chris@16: }; Chris@16: } Chris@16: Chris@16: struct member_object_eval Chris@16: { Chris@16: template Chris@16: struct result Chris@16: { Chris@16: typedef typename detail::member_type< Chris@16: typename eval_result::type>::type member_type; Chris@16: Chris@16: typedef typename meta::pointed_type< Chris@16: typename remove_reference< Chris@16: typename eval_result::type>::type>::type object_type; Chris@16: Chris@16: typedef typename add_reference< Chris@16: typename mpl::eval_if< Chris@16: is_const, Chris@16: add_const, Chris@16: mpl::identity >::type>::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: static typename result::type Chris@16: eval(const Env& env, PtrActor& ptrActor, MemPtrActor& memPtrActor) Chris@16: { Chris@16: return get_pointer(ptrActor.eval(env))->*memPtrActor.eval(env); Chris@16: } Chris@16: }; Chris@16: Chris@16: namespace member_object Chris@16: { Chris@16: template Chris@16: typename enable_if< Chris@16: mpl::and_, mpl::not_ > >, Chris@16: actor, Chris@16: typename as_actor::type>::type> >::type Chris@16: operator->*( Chris@16: const actor& ptrActor, Chris@16: MemObjPtr memObjPtr) Chris@16: { Chris@16: return compose( Chris@16: ptrActor, Chris@16: as_actor::convert(memObjPtr)); Chris@16: } Chris@16: } Chris@16: Chris@16: namespace member_function Chris@16: { Chris@16: template Chris@16: typename enable_if< Chris@16: is_member_function_pointer, Chris@16: mem_fun_ptr_gen, MemFunPtr> >::type Chris@16: operator->*(const actor& ptrActor, MemFunPtr memFunPtr) Chris@16: { Chris@16: return mem_fun_ptr_gen, MemFunPtr>( Chris@16: ptrActor, memFunPtr); Chris@16: } Chris@16: } Chris@16: Chris@16: using member_object::operator->*; Chris@16: using member_function::operator->*; Chris@16: }} Chris@16: Chris@16: #endif