/src/contrib/boost/spirit/home/phoenix/bind/bind_member_variable.hpp
http://pythonocc.googlecode.com/ · C++ Header · 105 lines · 87 code · 12 blank · 6 comment · 0 complexity · 829bbc0d2388381289c5611c1200b2fa MD5 · raw file
- /*=============================================================================
- 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 PHOENIX_BIND_BIND_MEMBER_VARIABLE_HPP
- #define PHOENIX_BIND_BIND_MEMBER_VARIABLE_HPP
- #include <boost/mpl/if.hpp>
- #include <boost/type_traits/is_const.hpp>
- #include <boost/type_traits/remove_pointer.hpp>
- #include <boost/type_traits/remove_reference.hpp>
- #include <boost/spirit/home/phoenix/core/actor.hpp>
- #include <boost/spirit/home/phoenix/core/compose.hpp>
- #include <boost/spirit/home/phoenix/core/reference.hpp>
- #include <boost/spirit/home/phoenix/core/detail/function_eval.hpp>
- #include <boost/mpl/if.hpp>
- #include <boost/type_traits/is_const.hpp>
- #include <boost/type_traits/remove_pointer.hpp>
- #include <boost/type_traits/remove_reference.hpp>
- namespace boost { namespace phoenix
- {
- namespace detail
- {
- template <typename RT, typename MP>
- struct member_variable
- {
- template <typename Class>
- struct result
- {
- typedef typename boost::mpl::if_<
- boost::is_const<
- typename boost::remove_pointer<
- typename boost::remove_reference<Class>::type
- >::type
- >
- , const RT&
- , RT&
- >::type type;
- };
- member_variable(MP mp)
- : mp(mp) {}
- template <typename Class>
- RT& operator()(Class& obj) const
- {
- return 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;
- }
- template <typename Class>
- RT const& operator()(Class const* obj) const
- {
- return obj->*mp;
- }
- MP mp;
- };
- }
- template <typename RT, typename ClassT, typename ClassA>
- inline actor<
- typename as_composite<
- detail::function_eval<1>
- , detail::member_variable<RT, RT ClassT::*>
- , ClassA
- >::type>
- bind(RT ClassT::*mp, ClassA const& obj)
- {
- typedef detail::member_variable<RT, RT ClassT::*> mp_type;
- return compose<detail::function_eval<1> >(mp_type(mp), obj);
- }
- template <typename RT, typename ClassT>
- inline actor<
- typename as_composite<
- detail::function_eval<1>
- , detail::member_variable<RT, RT ClassT::*>
- , actor<reference<ClassT> >
- >::type>
- bind(RT ClassT::*mp, ClassT& obj)
- {
- typedef detail::member_variable<RT, RT ClassT::*> mp_type;
- return compose<detail::function_eval<1> >(
- mp_type(mp)
- , actor<reference<ClassT> >(reference<ClassT>(obj)));
- }
- }}
- #endif