member.hpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /*=============================================================================
  2. Copyright (c) 2005-2007 Dan Marsden
  3. Copyright (c) 2005-2007 Joel de Guzman
  4. Distributed under the Boost Software License, Version 1.0. (See accompanying
  5. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. ==============================================================================*/
  7. #ifndef PHOENIX_OPERATOR_MEMBER_HPP
  8. #define PHOENIX_OPERATOR_MEMBER_HPP
  9. #include <boost/spirit/home/phoenix/core/actor.hpp>
  10. #include <boost/spirit/home/phoenix/core/composite.hpp>
  11. #include <boost/spirit/home/phoenix/core/compose.hpp>
  12. #include <boost/type_traits/add_reference.hpp>
  13. #include <boost/type_traits/add_const.hpp>
  14. #include <boost/type_traits/is_const.hpp>
  15. #include <boost/type_traits/remove_reference.hpp>
  16. #include <boost/type_traits/is_member_pointer.hpp>
  17. #include <boost/type_traits/is_member_function_pointer.hpp>
  18. #include <boost/mpl/eval_if.hpp>
  19. #include <boost/mpl/identity.hpp>
  20. #include <boost/mpl/and.hpp>
  21. #include <boost/mpl/not.hpp>
  22. #include <boost/utility/enable_if.hpp>
  23. #include <boost/get_pointer.hpp>
  24. #include <boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_gen.hpp>
  25. #include <memory>
  26. namespace boost {
  27. template<typename T> class shared_ptr;
  28. template<typename T> class scoped_ptr;
  29. namespace phoenix {
  30. namespace detail
  31. {
  32. template<typename T>
  33. struct member_type;
  34. template<typename Class, typename MemberType>
  35. struct member_type<MemberType (Class::*)>
  36. {
  37. typedef MemberType type;
  38. };
  39. }
  40. namespace meta
  41. {
  42. template<typename T>
  43. struct pointed_type;
  44. template<typename T>
  45. struct pointed_type<T*>
  46. {
  47. typedef T type;
  48. };
  49. template<typename T>
  50. struct pointed_type<shared_ptr<T> >
  51. {
  52. typedef T type;
  53. };
  54. template<typename T>
  55. struct pointed_type<scoped_ptr<T> >
  56. {
  57. typedef T type;
  58. };
  59. template<typename T>
  60. struct pointed_type<std::auto_ptr<T> >
  61. {
  62. typedef T type;
  63. };
  64. }
  65. struct member_object_eval
  66. {
  67. template<typename Env, typename PtrActor, typename MemPtrActor>
  68. struct result
  69. {
  70. typedef typename detail::member_type<
  71. typename eval_result<MemPtrActor, Env>::type>::type member_type;
  72. typedef typename meta::pointed_type<
  73. typename remove_reference<
  74. typename eval_result<PtrActor, Env>::type>::type>::type object_type;
  75. typedef typename add_reference<
  76. typename mpl::eval_if<
  77. is_const<object_type>,
  78. add_const<member_type>,
  79. mpl::identity<member_type> >::type>::type type;
  80. };
  81. template<typename Rt, typename Env, typename PtrActor, typename MemPtrActor>
  82. static typename result<Env,PtrActor,MemPtrActor>::type
  83. eval(const Env& env, PtrActor& ptrActor, MemPtrActor& memPtrActor)
  84. {
  85. return get_pointer(ptrActor.eval(env))->*memPtrActor.eval(env);
  86. }
  87. };
  88. namespace member_object
  89. {
  90. template<typename T0, typename MemObjPtr>
  91. typename enable_if<
  92. mpl::and_<is_member_pointer<MemObjPtr>, mpl::not_<is_member_function_pointer<MemObjPtr> > >,
  93. actor<typename as_composite<
  94. member_object_eval, actor<T0>,
  95. typename as_actor<MemObjPtr>::type>::type> >::type
  96. operator->*(
  97. const actor<T0>& ptrActor,
  98. MemObjPtr memObjPtr)
  99. {
  100. return compose<member_object_eval>(
  101. ptrActor,
  102. as_actor<MemObjPtr>::convert(memObjPtr));
  103. }
  104. }
  105. namespace member_function
  106. {
  107. template<typename T0, typename MemFunPtr>
  108. typename enable_if<
  109. is_member_function_pointer<MemFunPtr>,
  110. mem_fun_ptr_gen<actor<T0>, MemFunPtr> >::type
  111. operator->*(const actor<T0>& ptrActor, MemFunPtr memFunPtr)
  112. {
  113. return mem_fun_ptr_gen<actor<T0>, MemFunPtr>(
  114. ptrActor, memFunPtr);
  115. }
  116. }
  117. using member_object::operator->*;
  118. using member_function::operator->*;
  119. }}
  120. #endif