/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

  1. /*=============================================================================
  2. Copyright (c) 2001-2007 Joel de Guzman
  3. Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. ==============================================================================*/
  6. #ifndef PHOENIX_BIND_BIND_MEMBER_VARIABLE_HPP
  7. #define PHOENIX_BIND_BIND_MEMBER_VARIABLE_HPP
  8. #include <boost/mpl/if.hpp>
  9. #include <boost/type_traits/is_const.hpp>
  10. #include <boost/type_traits/remove_pointer.hpp>
  11. #include <boost/type_traits/remove_reference.hpp>
  12. #include <boost/spirit/home/phoenix/core/actor.hpp>
  13. #include <boost/spirit/home/phoenix/core/compose.hpp>
  14. #include <boost/spirit/home/phoenix/core/reference.hpp>
  15. #include <boost/spirit/home/phoenix/core/detail/function_eval.hpp>
  16. #include <boost/mpl/if.hpp>
  17. #include <boost/type_traits/is_const.hpp>
  18. #include <boost/type_traits/remove_pointer.hpp>
  19. #include <boost/type_traits/remove_reference.hpp>
  20. namespace boost { namespace phoenix
  21. {
  22. namespace detail
  23. {
  24. template <typename RT, typename MP>
  25. struct member_variable
  26. {
  27. template <typename Class>
  28. struct result
  29. {
  30. typedef typename boost::mpl::if_<
  31. boost::is_const<
  32. typename boost::remove_pointer<
  33. typename boost::remove_reference<Class>::type
  34. >::type
  35. >
  36. , const RT&
  37. , RT&
  38. >::type type;
  39. };
  40. member_variable(MP mp)
  41. : mp(mp) {}
  42. template <typename Class>
  43. RT& operator()(Class& obj) const
  44. {
  45. return obj.*mp;
  46. }
  47. template <typename Class>
  48. RT& operator()(Class* obj) const
  49. {
  50. return obj->*mp;
  51. }
  52. template <typename Class>
  53. RT const& operator()(Class const& obj) const
  54. {
  55. return obj.*mp;
  56. }
  57. template <typename Class>
  58. RT const& operator()(Class const* obj) const
  59. {
  60. return obj->*mp;
  61. }
  62. MP mp;
  63. };
  64. }
  65. template <typename RT, typename ClassT, typename ClassA>
  66. inline actor<
  67. typename as_composite<
  68. detail::function_eval<1>
  69. , detail::member_variable<RT, RT ClassT::*>
  70. , ClassA
  71. >::type>
  72. bind(RT ClassT::*mp, ClassA const& obj)
  73. {
  74. typedef detail::member_variable<RT, RT ClassT::*> mp_type;
  75. return compose<detail::function_eval<1> >(mp_type(mp), obj);
  76. }
  77. template <typename RT, typename ClassT>
  78. inline actor<
  79. typename as_composite<
  80. detail::function_eval<1>
  81. , detail::member_variable<RT, RT ClassT::*>
  82. , actor<reference<ClassT> >
  83. >::type>
  84. bind(RT ClassT::*mp, ClassT& obj)
  85. {
  86. typedef detail::member_variable<RT, RT ClassT::*> mp_type;
  87. return compose<detail::function_eval<1> >(
  88. mp_type(mp)
  89. , actor<reference<ClassT> >(reference<ClassT>(obj)));
  90. }
  91. }}
  92. #endif