extent.hpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. // (C) Copyright John Maddock 2005.
  2. // Use, modification and distribution are subject to the Boost Software License,
  3. // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  4. // http://www.boost.org/LICENSE_1_0.txt).
  5. //
  6. // See http://www.boost.org/libs/type_traits for most recent version including documentation.
  7. #ifndef BOOST_TT_EXTENT_HPP_INCLUDED
  8. #define BOOST_TT_EXTENT_HPP_INCLUDED
  9. #include <cstddef> // size_t
  10. #include <boost/type_traits/integral_constant.hpp>
  11. #include <boost/detail/workaround.hpp>
  12. namespace boost {
  13. namespace detail{
  14. #if defined( __CODEGEARC__ )
  15. // wrap the impl as main trait provides additional MPL lambda support
  16. template < typename T, std::size_t N >
  17. struct extent_imp {
  18. static const std::size_t value = __array_extent(T, N);
  19. };
  20. #else
  21. template <class T, std::size_t N>
  22. struct extent_imp
  23. {
  24. BOOST_STATIC_CONSTANT(std::size_t, value = 0);
  25. };
  26. #if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)
  27. template <class T, std::size_t R, std::size_t N>
  28. struct extent_imp<T[R], N>
  29. {
  30. BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::extent_imp<T, N-1>::value));
  31. };
  32. template <class T, std::size_t R, std::size_t N>
  33. struct extent_imp<T const[R], N>
  34. {
  35. BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::extent_imp<T, N-1>::value));
  36. };
  37. template <class T, std::size_t R, std::size_t N>
  38. struct extent_imp<T volatile[R], N>
  39. {
  40. BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::extent_imp<T, N-1>::value));
  41. };
  42. template <class T, std::size_t R, std::size_t N>
  43. struct extent_imp<T const volatile[R], N>
  44. {
  45. BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::extent_imp<T, N-1>::value));
  46. };
  47. template <class T, std::size_t R>
  48. struct extent_imp<T[R],0>
  49. {
  50. BOOST_STATIC_CONSTANT(std::size_t, value = R);
  51. };
  52. template <class T, std::size_t R>
  53. struct extent_imp<T const[R], 0>
  54. {
  55. BOOST_STATIC_CONSTANT(std::size_t, value = R);
  56. };
  57. template <class T, std::size_t R>
  58. struct extent_imp<T volatile[R], 0>
  59. {
  60. BOOST_STATIC_CONSTANT(std::size_t, value = R);
  61. };
  62. template <class T, std::size_t R>
  63. struct extent_imp<T const volatile[R], 0>
  64. {
  65. BOOST_STATIC_CONSTANT(std::size_t, value = R);
  66. };
  67. #if !BOOST_WORKAROUND(__BORLANDC__, < 0x600) && !defined(__IBMCPP__) && !BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840)) && !defined(__MWERKS__)
  68. template <class T, std::size_t N>
  69. struct extent_imp<T[], N>
  70. {
  71. BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::extent_imp<T, N-1>::value));
  72. };
  73. template <class T, std::size_t N>
  74. struct extent_imp<T const[], N>
  75. {
  76. BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::extent_imp<T, N-1>::value));
  77. };
  78. template <class T, std::size_t N>
  79. struct extent_imp<T volatile[], N>
  80. {
  81. BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::extent_imp<T, N-1>::value));
  82. };
  83. template <class T, std::size_t N>
  84. struct extent_imp<T const volatile[], N>
  85. {
  86. BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::extent_imp<T, N-1>::value));
  87. };
  88. template <class T>
  89. struct extent_imp<T[], 0>
  90. {
  91. BOOST_STATIC_CONSTANT(std::size_t, value = 0);
  92. };
  93. template <class T>
  94. struct extent_imp<T const[], 0>
  95. {
  96. BOOST_STATIC_CONSTANT(std::size_t, value = 0);
  97. };
  98. template <class T>
  99. struct extent_imp<T volatile[], 0>
  100. {
  101. BOOST_STATIC_CONSTANT(std::size_t, value = 0);
  102. };
  103. template <class T>
  104. struct extent_imp<T const volatile[], 0>
  105. {
  106. BOOST_STATIC_CONSTANT(std::size_t, value = 0);
  107. };
  108. #endif
  109. #endif
  110. #endif // non-CodeGear implementation
  111. } // ::boost::detail
  112. template <class T, std::size_t N = 0>
  113. struct extent
  114. : public ::boost::integral_constant<std::size_t, ::boost::detail::extent_imp<T,N>::value>
  115. {
  116. };
  117. } // namespace boost
  118. #endif // BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED