annotate DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/member.hpp @ 56:08f5d78e4b5f

Subrepo update
author Chris Cannam
date Mon, 11 Aug 2014 11:33:41 +0100
parents 2665513ce2d3
children
rev   line source
Chris@16 1 /*=============================================================================
Chris@16 2 Copyright (c) 2005-2007 Dan Marsden
Chris@16 3 Copyright (c) 2005-2007 Joel de Guzman
Chris@16 4
Chris@16 5 Distributed under the Boost Software License, Version 1.0. (See accompanying
Chris@16 6 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 7 ==============================================================================*/
Chris@16 8
Chris@16 9 #ifndef PHOENIX_OPERATOR_MEMBER_HPP
Chris@16 10 #define PHOENIX_OPERATOR_MEMBER_HPP
Chris@16 11
Chris@16 12 #include <boost/spirit/home/phoenix/core/actor.hpp>
Chris@16 13 #include <boost/spirit/home/phoenix/core/composite.hpp>
Chris@16 14 #include <boost/spirit/home/phoenix/core/compose.hpp>
Chris@16 15
Chris@16 16 #include <boost/type_traits/add_reference.hpp>
Chris@16 17 #include <boost/type_traits/add_const.hpp>
Chris@16 18 #include <boost/type_traits/is_const.hpp>
Chris@16 19 #include <boost/type_traits/remove_reference.hpp>
Chris@16 20 #include <boost/type_traits/is_member_pointer.hpp>
Chris@16 21 #include <boost/type_traits/is_member_function_pointer.hpp>
Chris@16 22
Chris@16 23 #include <boost/mpl/eval_if.hpp>
Chris@16 24 #include <boost/mpl/identity.hpp>
Chris@16 25 #include <boost/mpl/and.hpp>
Chris@16 26 #include <boost/mpl/not.hpp>
Chris@16 27
Chris@16 28 #include <boost/utility/enable_if.hpp>
Chris@16 29
Chris@16 30 #include <boost/get_pointer.hpp>
Chris@16 31
Chris@16 32 #include <boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_gen.hpp>
Chris@16 33
Chris@16 34 #include <memory>
Chris@16 35
Chris@16 36 namespace boost {
Chris@16 37 template<typename T> class shared_ptr;
Chris@16 38 template<typename T> class scoped_ptr;
Chris@16 39
Chris@16 40 namespace phoenix {
Chris@16 41 namespace detail
Chris@16 42 {
Chris@16 43 template<typename T>
Chris@16 44 struct member_type;
Chris@16 45
Chris@16 46 template<typename Class, typename MemberType>
Chris@16 47 struct member_type<MemberType (Class::*)>
Chris@16 48 {
Chris@16 49 typedef MemberType type;
Chris@16 50 };
Chris@16 51 }
Chris@16 52
Chris@16 53 namespace meta
Chris@16 54 {
Chris@16 55 template<typename T>
Chris@16 56 struct pointed_type;
Chris@16 57
Chris@16 58 template<typename T>
Chris@16 59 struct pointed_type<T*>
Chris@16 60 {
Chris@16 61 typedef T type;
Chris@16 62 };
Chris@16 63
Chris@16 64 template<typename T>
Chris@16 65 struct pointed_type<shared_ptr<T> >
Chris@16 66 {
Chris@16 67 typedef T type;
Chris@16 68 };
Chris@16 69
Chris@16 70 template<typename T>
Chris@16 71 struct pointed_type<scoped_ptr<T> >
Chris@16 72 {
Chris@16 73 typedef T type;
Chris@16 74 };
Chris@16 75
Chris@16 76 template<typename T>
Chris@16 77 struct pointed_type<std::auto_ptr<T> >
Chris@16 78 {
Chris@16 79 typedef T type;
Chris@16 80 };
Chris@16 81 }
Chris@16 82
Chris@16 83 struct member_object_eval
Chris@16 84 {
Chris@16 85 template<typename Env, typename PtrActor, typename MemPtrActor>
Chris@16 86 struct result
Chris@16 87 {
Chris@16 88 typedef typename detail::member_type<
Chris@16 89 typename eval_result<MemPtrActor, Env>::type>::type member_type;
Chris@16 90
Chris@16 91 typedef typename meta::pointed_type<
Chris@16 92 typename remove_reference<
Chris@16 93 typename eval_result<PtrActor, Env>::type>::type>::type object_type;
Chris@16 94
Chris@16 95 typedef typename add_reference<
Chris@16 96 typename mpl::eval_if<
Chris@16 97 is_const<object_type>,
Chris@16 98 add_const<member_type>,
Chris@16 99 mpl::identity<member_type> >::type>::type type;
Chris@16 100 };
Chris@16 101
Chris@16 102 template<typename Rt, typename Env, typename PtrActor, typename MemPtrActor>
Chris@16 103 static typename result<Env,PtrActor,MemPtrActor>::type
Chris@16 104 eval(const Env& env, PtrActor& ptrActor, MemPtrActor& memPtrActor)
Chris@16 105 {
Chris@16 106 return get_pointer(ptrActor.eval(env))->*memPtrActor.eval(env);
Chris@16 107 }
Chris@16 108 };
Chris@16 109
Chris@16 110 namespace member_object
Chris@16 111 {
Chris@16 112 template<typename T0, typename MemObjPtr>
Chris@16 113 typename enable_if<
Chris@16 114 mpl::and_<is_member_pointer<MemObjPtr>, mpl::not_<is_member_function_pointer<MemObjPtr> > >,
Chris@16 115 actor<typename as_composite<
Chris@16 116 member_object_eval, actor<T0>,
Chris@16 117 typename as_actor<MemObjPtr>::type>::type> >::type
Chris@16 118 operator->*(
Chris@16 119 const actor<T0>& ptrActor,
Chris@16 120 MemObjPtr memObjPtr)
Chris@16 121 {
Chris@16 122 return compose<member_object_eval>(
Chris@16 123 ptrActor,
Chris@16 124 as_actor<MemObjPtr>::convert(memObjPtr));
Chris@16 125 }
Chris@16 126 }
Chris@16 127
Chris@16 128 namespace member_function
Chris@16 129 {
Chris@16 130 template<typename T0, typename MemFunPtr>
Chris@16 131 typename enable_if<
Chris@16 132 is_member_function_pointer<MemFunPtr>,
Chris@16 133 mem_fun_ptr_gen<actor<T0>, MemFunPtr> >::type
Chris@16 134 operator->*(const actor<T0>& ptrActor, MemFunPtr memFunPtr)
Chris@16 135 {
Chris@16 136 return mem_fun_ptr_gen<actor<T0>, MemFunPtr>(
Chris@16 137 ptrActor, memFunPtr);
Chris@16 138 }
Chris@16 139 }
Chris@16 140
Chris@16 141 using member_object::operator->*;
Chris@16 142 using member_function::operator->*;
Chris@16 143 }}
Chris@16 144
Chris@16 145 #endif