comparison DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/member.hpp @ 16:2665513ce2d3

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