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