Chris@16
|
1 /*=============================================================================
|
Chris@16
|
2 Copyright (c) 2001-2007 Joel de Guzman
|
Chris@16
|
3
|
Chris@16
|
4 Distributed under the Boost Software License, Version 1.0. (See accompanying
|
Chris@16
|
5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
6 ==============================================================================*/
|
Chris@16
|
7 #ifndef BOOST_PHOENIX_CORE_DETAIL_MEMBER_VARIABLE_HPP
|
Chris@16
|
8 #define BOOST_PHOENIX_CORE_DETAIL_MEMBER_VARIABLE_HPP
|
Chris@16
|
9
|
Chris@16
|
10 #include <boost/proto/detail/decltype.hpp>
|
Chris@16
|
11 #include <boost/type_traits/remove_pointer.hpp>
|
Chris@16
|
12
|
Chris@16
|
13 #ifdef _MSC_VER
|
Chris@16
|
14 #pragma warning(push)
|
Chris@16
|
15 #pragma warning(disable: 4180) // qualifier applied to function type has no meaning; ignored
|
Chris@16
|
16 #endif
|
Chris@16
|
17
|
Chris@16
|
18 namespace boost { namespace phoenix { namespace detail {
|
Chris@16
|
19
|
Chris@16
|
20 template <typename RT, typename MP>
|
Chris@16
|
21 struct member_variable
|
Chris@16
|
22 {
|
Chris@16
|
23 template <typename Sig>
|
Chris@16
|
24 struct result;
|
Chris@16
|
25
|
Chris@16
|
26 template <typename This, typename Class>
|
Chris@16
|
27 struct result<This(Class)>
|
Chris@16
|
28 : result<This(Class const &)>
|
Chris@16
|
29 {};
|
Chris@16
|
30
|
Chris@16
|
31 template <typename This, typename Class>
|
Chris@16
|
32 struct result<This(Class &)>
|
Chris@16
|
33 {
|
Chris@16
|
34 typedef typename boost::mpl::if_c<
|
Chris@16
|
35 boost::is_const<
|
Chris@16
|
36 typename boost::remove_pointer<
|
Chris@16
|
37 typename boost::remove_reference<Class>::type
|
Chris@16
|
38 >::type
|
Chris@16
|
39 >::value
|
Chris@16
|
40 , const RT&
|
Chris@16
|
41 , RT&
|
Chris@16
|
42 >::type
|
Chris@16
|
43 type;
|
Chris@16
|
44 };
|
Chris@16
|
45
|
Chris@101
|
46 member_variable(MP mp_)
|
Chris@101
|
47 : mp(mp_) {}
|
Chris@16
|
48
|
Chris@16
|
49 template <typename Class>
|
Chris@16
|
50 RT& operator()(Class& obj) const
|
Chris@16
|
51 {
|
Chris@16
|
52 BOOST_PROTO_USE_GET_POINTER();
|
Chris@16
|
53
|
Chris@16
|
54 typedef typename proto::detail::class_member_traits<MP>::class_type class_type;
|
Chris@16
|
55 return (BOOST_PROTO_GET_POINTER(class_type, obj)->*mp);
|
Chris@16
|
56 }
|
Chris@16
|
57
|
Chris@16
|
58 template <typename Class>
|
Chris@101
|
59 RT& operator()(Class* obj) const
|
Chris@101
|
60 {
|
Chris@101
|
61 return obj->*mp;
|
Chris@101
|
62 }
|
Chris@101
|
63
|
Chris@101
|
64 template <typename Class>
|
Chris@16
|
65 RT const& operator()(Class const& obj) const
|
Chris@16
|
66 {
|
Chris@16
|
67 BOOST_PROTO_USE_GET_POINTER();
|
Chris@16
|
68
|
Chris@16
|
69 typedef typename proto::detail::class_member_traits<MP>::class_type class_type;
|
Chris@16
|
70 return (BOOST_PROTO_GET_POINTER(class_type, obj)->*mp);
|
Chris@16
|
71 }
|
Chris@16
|
72
|
Chris@16
|
73 template <typename Class>
|
Chris@16
|
74 RT const& operator()(Class const* obj) const
|
Chris@16
|
75 {
|
Chris@16
|
76 return obj->*mp;
|
Chris@16
|
77 }
|
Chris@16
|
78
|
Chris@16
|
79 MP mp;
|
Chris@16
|
80 };
|
Chris@16
|
81 }}}
|
Chris@16
|
82
|
Chris@16
|
83 #ifdef _MSC_VER
|
Chris@16
|
84 #pragma warning(pop)
|
Chris@16
|
85 #endif
|
Chris@16
|
86
|
Chris@16
|
87 #endif
|