Chris@16: /*============================================================================= Chris@16: Copyright (c) 2001-2007 Joel de Guzman Chris@16: Chris@16: Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: ==============================================================================*/ Chris@16: #ifndef BOOST_PHOENIX_CORE_DETAIL_MEMBER_VARIABLE_HPP Chris@16: #define BOOST_PHOENIX_CORE_DETAIL_MEMBER_VARIABLE_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: #ifdef _MSC_VER Chris@16: #pragma warning(push) Chris@16: #pragma warning(disable: 4180) // qualifier applied to function type has no meaning; ignored Chris@16: #endif Chris@16: Chris@16: namespace boost { namespace phoenix { namespace detail { Chris@16: Chris@16: template Chris@16: struct member_variable Chris@16: { Chris@16: template Chris@16: struct result; Chris@16: Chris@16: template Chris@16: struct result Chris@16: : result Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct result Chris@16: { Chris@16: typedef typename boost::mpl::if_c< Chris@16: boost::is_const< Chris@16: typename boost::remove_pointer< Chris@16: typename boost::remove_reference::type Chris@16: >::type Chris@16: >::value Chris@16: , const RT& Chris@16: , RT& Chris@16: >::type Chris@16: type; Chris@16: }; Chris@16: Chris@101: member_variable(MP mp_) Chris@101: : mp(mp_) {} Chris@16: Chris@16: template Chris@16: RT& operator()(Class& obj) const Chris@16: { Chris@16: BOOST_PROTO_USE_GET_POINTER(); Chris@16: Chris@16: typedef typename proto::detail::class_member_traits::class_type class_type; Chris@16: return (BOOST_PROTO_GET_POINTER(class_type, obj)->*mp); Chris@16: } Chris@16: Chris@16: template Chris@101: RT& operator()(Class* obj) const Chris@101: { Chris@101: return obj->*mp; Chris@101: } Chris@101: Chris@101: template Chris@16: RT const& operator()(Class const& obj) const Chris@16: { Chris@16: BOOST_PROTO_USE_GET_POINTER(); Chris@16: Chris@16: typedef typename proto::detail::class_member_traits::class_type class_type; Chris@16: return (BOOST_PROTO_GET_POINTER(class_type, obj)->*mp); Chris@16: } Chris@16: Chris@16: template Chris@16: RT const& operator()(Class const* obj) const Chris@16: { Chris@16: return obj->*mp; Chris@16: } Chris@16: Chris@16: MP mp; Chris@16: }; Chris@16: }}} Chris@16: Chris@16: #ifdef _MSC_VER Chris@16: #pragma warning(pop) Chris@16: #endif Chris@16: Chris@16: #endif