ptr.hpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #ifndef PTR_DWA20020601_HPP
  2. # define PTR_DWA20020601_HPP
  3. # include <boost/python/detail/prefix.hpp>
  4. // Copyright David Abrahams 2002.
  5. // Distributed under the Boost Software License, Version 1.0. (See
  6. // accompanying file LICENSE_1_0.txt or copy at
  7. // http://www.boost.org/LICENSE_1_0.txt)
  8. //
  9. // Based on boost/ref.hpp, thus:
  10. // Copyright (C) 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi)
  11. // Copyright (C) 2001 Peter Dimov
  12. # if _MSC_VER+0 >= 1020
  13. # pragma once
  14. # endif
  15. # include <boost/config.hpp>
  16. # include <boost/mpl/bool.hpp>
  17. namespace boost { namespace python {
  18. template<class Ptr> class pointer_wrapper
  19. {
  20. public:
  21. typedef Ptr type;
  22. explicit pointer_wrapper(Ptr x): p_(x) {}
  23. operator Ptr() const { return p_; }
  24. Ptr get() const { return p_; }
  25. private:
  26. Ptr p_;
  27. };
  28. template<class T>
  29. inline pointer_wrapper<T> ptr(T t)
  30. {
  31. return pointer_wrapper<T>(t);
  32. }
  33. # ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
  34. template<typename T>
  35. class is_pointer_wrapper
  36. : public mpl::false_
  37. {
  38. };
  39. template<typename T>
  40. class is_pointer_wrapper<pointer_wrapper<T> >
  41. : public mpl::true_
  42. {
  43. };
  44. template<typename T>
  45. class unwrap_pointer
  46. {
  47. public:
  48. typedef T type;
  49. };
  50. template<typename T>
  51. class unwrap_pointer<pointer_wrapper<T> >
  52. {
  53. public:
  54. typedef T type;
  55. };
  56. # else // no partial specialization
  57. }} // namespace boost::python
  58. #include <boost/type.hpp>
  59. namespace boost { namespace python {
  60. namespace detail
  61. {
  62. typedef char (&yes_pointer_wrapper_t)[1];
  63. typedef char (&no_pointer_wrapper_t)[2];
  64. no_pointer_wrapper_t is_pointer_wrapper_test(...);
  65. template<typename T>
  66. yes_pointer_wrapper_t is_pointer_wrapper_test(boost::type< pointer_wrapper<T> >);
  67. template<bool wrapped>
  68. struct pointer_unwrapper
  69. {
  70. template <class T>
  71. struct apply
  72. {
  73. typedef T type;
  74. };
  75. };
  76. template<>
  77. struct pointer_unwrapper<true>
  78. {
  79. template <class T>
  80. struct apply
  81. {
  82. typedef typename T::type type;
  83. };
  84. };
  85. }
  86. template<typename T>
  87. class is_pointer_wrapper
  88. {
  89. public:
  90. BOOST_STATIC_CONSTANT(
  91. bool, value = (
  92. sizeof(detail::is_pointer_wrapper_test(boost::type<T>()))
  93. == sizeof(detail::yes_pointer_wrapper_t)));
  94. typedef mpl::bool_<value> type;
  95. };
  96. template <typename T>
  97. class unwrap_pointer
  98. : public detail::pointer_unwrapper<
  99. is_pointer_wrapper<T>::value
  100. >::template apply<T>
  101. {};
  102. # endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
  103. }} // namespace boost::python
  104. #endif // #ifndef PTR_DWA20020601_HPP