/Src/Dependencies/Boost/boost/random/detail/ptr_helper.hpp

http://hadesmem.googlecode.com/ · C++ Header · 94 lines · 65 code · 10 blank · 19 comment · 0 complexity · dfb06cb89100c723922f6751187be3ba MD5 · raw file

  1. /* boost random/detail/ptr_helper.hpp header file
  2. *
  3. * Copyright Jens Maurer 2002
  4. * Distributed under the Boost Software License, Version 1.0. (See
  5. * accompanying file LICENSE_1_0.txt or copy at
  6. * http://www.boost.org/LICENSE_1_0.txt)
  7. *
  8. * See http://www.boost.org for most recent version including documentation.
  9. *
  10. * $Id: ptr_helper.hpp 24096 2004-07-27 03:43:34Z dgregor $
  11. *
  12. */
  13. #ifndef BOOST_RANDOM_DETAIL_PTR_HELPER_HPP
  14. #define BOOST_RANDOM_DETAIL_PTR_HELPER_HPP
  15. #include <boost/config.hpp>
  16. namespace boost {
  17. namespace random {
  18. namespace detail {
  19. // type_traits could help here, but I don't want to depend on type_traits.
  20. template<class T>
  21. struct ptr_helper
  22. {
  23. typedef T value_type;
  24. typedef T& reference_type;
  25. typedef const T& rvalue_type;
  26. static reference_type ref(T& r) { return r; }
  27. static const T& ref(const T& r) { return r; }
  28. };
  29. #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
  30. template<class T>
  31. struct ptr_helper<T&>
  32. {
  33. typedef T value_type;
  34. typedef T& reference_type;
  35. typedef T& rvalue_type;
  36. static reference_type ref(T& r) { return r; }
  37. static const T& ref(const T& r) { return r; }
  38. };
  39. template<class T>
  40. struct ptr_helper<T*>
  41. {
  42. typedef T value_type;
  43. typedef T& reference_type;
  44. typedef T* rvalue_type;
  45. static reference_type ref(T * p) { return *p; }
  46. static const T& ref(const T * p) { return *p; }
  47. };
  48. #endif
  49. } // namespace detail
  50. } // namespace random
  51. } // namespace boost
  52. //
  53. // BOOST_RANDOM_PTR_HELPER_SPEC --
  54. //
  55. // Helper macro for broken compilers defines specializations of
  56. // ptr_helper.
  57. //
  58. #ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
  59. # define BOOST_RANDOM_PTR_HELPER_SPEC(T) \
  60. namespace boost { namespace random { namespace detail { \
  61. template<> \
  62. struct ptr_helper<T&> \
  63. { \
  64. typedef T value_type; \
  65. typedef T& reference_type; \
  66. typedef T& rvalue_type; \
  67. static reference_type ref(T& r) { return r; } \
  68. static const T& ref(const T& r) { return r; } \
  69. }; \
  70. \
  71. template<> \
  72. struct ptr_helper<T*> \
  73. { \
  74. typedef T value_type; \
  75. typedef T& reference_type; \
  76. typedef T* rvalue_type; \
  77. static reference_type ref(T * p) { return *p; } \
  78. static const T& ref(const T * p) { return *p; } \
  79. }; \
  80. }}}
  81. #else
  82. # define BOOST_RANDOM_PTR_HELPER_SPEC(T)
  83. #endif
  84. #endif // BOOST_RANDOM_DETAIL_PTR_HELPER_HPP