88 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			88 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /*============================================================================= | ||
|  |     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> | ||
|  | 
 | ||
|  | #ifdef _MSC_VER | ||
|  | #pragma warning(push) | ||
|  | #pragma warning(disable: 4180) // qualifier applied to function type has no meaning; ignored | ||
|  | #endif | ||
|  | 
 | ||
|  | 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::class_member_traits<MP>::class_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 | ||
|  |             { | ||
|  |                 BOOST_PROTO_USE_GET_POINTER(); | ||
|  | 
 | ||
|  |                 typedef typename proto::detail::class_member_traits<MP>::class_type class_type; | ||
|  |                 return (BOOST_PROTO_GET_POINTER(class_type, obj)->*mp); | ||
|  |             } | ||
|  | 
 | ||
|  |             template <typename Class> | ||
|  |             RT const& operator()(Class const* obj) const | ||
|  |             { | ||
|  |                 return obj->*mp; | ||
|  |             } | ||
|  | 
 | ||
|  |             MP mp; | ||
|  |         }; | ||
|  | }}} | ||
|  | 
 | ||
|  | #ifdef _MSC_VER | ||
|  | #pragma warning(pop) | ||
|  | #endif | ||
|  | 
 | ||
|  | #endif |