You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
78 lines
2.4 KiB
78 lines
2.4 KiB
/*============================================================================= |
|
Copyright (c) 2001-2007 Joel de Guzman |
|
|
|
Distributed under the Boost Software License, Version 1.0. (See accompanying |
|
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
|
==============================================================================*/ |
|
#ifndef BOOST_PHOENIX_CORE_DETAIL_MEMBER_VARIABLE_HPP |
|
#define BOOST_PHOENIX_CORE_DETAIL_MEMBER_VARIABLE_HPP |
|
|
|
#include <boost/proto/detail/decltype.hpp> |
|
#include <boost/type_traits/remove_pointer.hpp> |
|
|
|
namespace boost { namespace phoenix { namespace detail { |
|
|
|
template <typename RT, typename MP> |
|
struct member_variable |
|
{ |
|
template <typename Sig> |
|
struct result; |
|
|
|
template <typename This, typename Class> |
|
struct result<This(Class)> |
|
: result<This(Class const &)> |
|
{}; |
|
|
|
template <typename This, typename Class> |
|
struct result<This(Class &)> |
|
{ |
|
typedef typename boost::mpl::if_c< |
|
boost::is_const< |
|
typename boost::remove_pointer< |
|
typename boost::remove_reference<Class>::type |
|
>::type |
|
>::value |
|
, const RT& |
|
, RT& |
|
>::type |
|
type; |
|
}; |
|
|
|
member_variable(MP mp) |
|
: mp(mp) {} |
|
|
|
template <typename Class> |
|
RT& operator()(Class& obj) const |
|
{ |
|
BOOST_PROTO_USE_GET_POINTER(); |
|
|
|
typedef typename proto::detail::classtypeof<MP>::type class_type; |
|
return (BOOST_PROTO_GET_POINTER(class_type, obj)->*mp); |
|
} |
|
|
|
template <typename Class> |
|
RT const& operator()(Class const& obj) const |
|
{ |
|
BOOST_PROTO_USE_GET_POINTER(); |
|
|
|
typedef typename proto::detail::classtypeof<MP>::type class_type; |
|
return (BOOST_PROTO_GET_POINTER(class_type, obj)->*mp); |
|
} |
|
|
|
template <typename Class> |
|
RT& operator()(Class* obj) const |
|
{ |
|
return obj->*mp; |
|
} |
|
|
|
template <typename Class> |
|
RT const& operator()(Class const* obj) const |
|
{ |
|
return obj->*mp; |
|
} |
|
|
|
MP mp; |
|
}; |
|
}}} |
|
|
|
#endif
|
|
|