size.hpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. // Boost.Range library
  2. //
  3. // Copyright Thorsten Ottosen 2003-2004. Use, modification and
  4. // distribution is subject to the Boost Software License, Version
  5. // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. //
  8. // For more information, see http://www.boost.org/libs/range/
  9. //
  10. #ifndef BOOST_RANGE_DETAIL_VC6_SIZE_HPP
  11. #define BOOST_RANGE_DETAIL_VC6_SIZE_HPP
  12. #include <boost/range/detail/implementation_help.hpp>
  13. #include <boost/range/detail/size_type.hpp>
  14. #include <boost/range/detail/common.hpp>
  15. #include <boost/range/detail/remove_extent.hpp>
  16. #include <iterator>
  17. namespace boost
  18. {
  19. namespace range_detail
  20. {
  21. template< typename T >
  22. struct range_size_;
  23. //////////////////////////////////////////////////////////////////////
  24. // default
  25. //////////////////////////////////////////////////////////////////////
  26. template<>
  27. struct range_size_<std_container_>
  28. {
  29. template< typename C >
  30. struct inner {
  31. static BOOST_RANGE_DEDUCED_TYPENAME C::size_type fun( const C& c )
  32. {
  33. return c.size();
  34. };
  35. };
  36. };
  37. //////////////////////////////////////////////////////////////////////
  38. // pair
  39. //////////////////////////////////////////////////////////////////////
  40. template<>
  41. struct range_size_<std_pair_>
  42. {
  43. template< typename P >
  44. struct inner {
  45. static BOOST_RANGE_DEDUCED_TYPENAME range_size<P>::type
  46. fun( const P& p )
  47. {
  48. return std::distance( p.first, p.second );
  49. }
  50. };
  51. };
  52. //////////////////////////////////////////////////////////////////////
  53. // array
  54. //////////////////////////////////////////////////////////////////////
  55. template<>
  56. struct range_size_<array_>
  57. {
  58. template<typename T>
  59. struct inner {
  60. static std::size_t fun(T& t)
  61. {
  62. return remove_extent<T>::size;
  63. }
  64. };
  65. };
  66. template<>
  67. struct range_size_<char_array_>
  68. {
  69. template<typename T>
  70. struct inner {
  71. static std::size_t fun(T& t)
  72. {
  73. return sizeof(T) / sizeof(T[0]);
  74. }
  75. };
  76. };
  77. template<>
  78. struct range_size_<wchar_t_array_>
  79. {
  80. template<typename T>
  81. struct inner {
  82. static std::size_t fun(T& t)
  83. {
  84. return sizeof(T) / sizeof(T[0]);
  85. }
  86. };
  87. };
  88. //////////////////////////////////////////////////////////////////////
  89. // string
  90. //////////////////////////////////////////////////////////////////////
  91. template<>
  92. struct range_size_<char_ptr_>
  93. {
  94. template<typename T>
  95. struct inner {
  96. static std::size_t fun( const char* s )
  97. {
  98. return boost::range_detail::str_size( s );
  99. }
  100. };
  101. };
  102. template<>
  103. struct range_size_<const_char_ptr_>
  104. {
  105. template<typename T>
  106. struct inner {
  107. static std::size_t fun( const char* s )
  108. {
  109. return boost::range_detail::str_size( s );
  110. }
  111. };
  112. };
  113. template<>
  114. struct range_size_<wchar_t_ptr_>
  115. {
  116. template<typename T>
  117. struct inner {
  118. static std::size_t fun( const wchar_t* s )
  119. {
  120. return boost::range_detail::str_size( s );
  121. }
  122. };
  123. };
  124. template<>
  125. struct range_size_<const_wchar_t_ptr_>
  126. {
  127. template<typename T>
  128. struct inner {
  129. static std::size_t fun( const wchar_t* s )
  130. {
  131. return boost::range_detail::str_size( s );
  132. }
  133. };
  134. };
  135. } // namespace 'range_detail'
  136. template< typename C >
  137. BOOST_RANGE_DEDUCED_TYPENAME range_size<C>::type
  138. size( const C& c )
  139. {
  140. return range_detail::range_size_<range_detail::range<C>::type>::inner<C>::fun( c );
  141. }
  142. } // namespace 'boost'
  143. #endif