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