empty.hpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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_EMPTY_HPP
  11. #define BOOST_RANGE_DETAIL_EMPTY_HPP
  12. #include <boost/range/detail/common.hpp>
  13. namespace boost
  14. {
  15. namespace range_detail
  16. {
  17. template< typename T >
  18. struct range_empty;
  19. //////////////////////////////////////////////////////////////////////
  20. // default
  21. //////////////////////////////////////////////////////////////////////
  22. template<>
  23. struct range_empty<std_container_>
  24. {
  25. template< typename C >
  26. static bool fun( C& c )
  27. {
  28. return c.empty();
  29. };
  30. };
  31. //////////////////////////////////////////////////////////////////////
  32. // pair
  33. //////////////////////////////////////////////////////////////////////
  34. template<>
  35. struct range_empty<std_pair_>
  36. {
  37. template< typename P >
  38. static bool fun( const P& p )
  39. {
  40. return p.first == p.second;
  41. }
  42. };
  43. //////////////////////////////////////////////////////////////////////
  44. // array
  45. //////////////////////////////////////////////////////////////////////
  46. template<>
  47. struct range_empty<array_>
  48. {
  49. template< typename T, std::size_t sz >
  50. static bool fun( T BOOST_ARRAY_REF[sz] )
  51. {
  52. if( boost_range_array == 0 )
  53. return true;
  54. return false;
  55. }
  56. };
  57. //////////////////////////////////////////////////////////////////////
  58. // string
  59. //////////////////////////////////////////////////////////////////////
  60. template<>
  61. struct range_empty<char_ptr_>
  62. {
  63. static bool fun( const char* s )
  64. {
  65. return s == 0 || s[0] == 0;
  66. }
  67. };
  68. template<>
  69. struct range_empty<const_char_ptr_>
  70. {
  71. static bool fun( const char* s )
  72. {
  73. return s == 0 || s[0] == 0;
  74. }
  75. };
  76. template<>
  77. struct range_empty<wchar_t_ptr_>
  78. {
  79. static bool fun( const wchar_t* s )
  80. {
  81. return s == 0 || s[0] == 0;
  82. }
  83. };
  84. template<>
  85. struct range_empty<const_wchar_t_ptr_>
  86. {
  87. static bool fun( const wchar_t* s )
  88. {
  89. return s == 0 || s[0] == 0;
  90. }
  91. };
  92. } // namespace 'range_detail'
  93. template< typename C >
  94. inline bool
  95. empty( const C& c )
  96. {
  97. return range_detail::range_empty< BOOST_RANGE_DEDUCED_TYPENAME range_detail::range<C>::type >::fun( c );
  98. }
  99. } // namespace 'boost'
  100. #endif