Mercurial > hg > vamp-build-and-test
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 |