count.cpp 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // Boost.Range library
  2. //
  3. // Copyright Neil Groves 2009. 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. //
  9. // For more information, see http://www.boost.org/libs/range/
  10. //
  11. #include <boost/range/algorithm/count.hpp>
  12. #include <boost/test/test_tools.hpp>
  13. #include <boost/test/unit_test.hpp>
  14. #include <boost/assign.hpp>
  15. #include <algorithm>
  16. #include <list>
  17. #include <set>
  18. #include <vector>
  19. namespace boost
  20. {
  21. namespace
  22. {
  23. template< class Container >
  24. void test_count_impl()
  25. {
  26. using namespace boost::assign;
  27. Container cont;
  28. const Container& cref_cont = cont;
  29. BOOST_CHECK_EQUAL( 0u, boost::count(cont, 0u) );
  30. BOOST_CHECK_EQUAL( 0u, boost::count(cref_cont, 0u) );
  31. BOOST_CHECK_EQUAL( 0u, boost::count(boost::make_iterator_range(cont), 0u) );
  32. cont += 1;
  33. BOOST_CHECK_EQUAL( 0u, boost::count(cont, 0u) );
  34. BOOST_CHECK_EQUAL( 0u, boost::count(cref_cont, 0u) );
  35. BOOST_CHECK_EQUAL( 0u, boost::count(boost::make_iterator_range(cont), 0u) );
  36. BOOST_CHECK_EQUAL( 1u, boost::count(cont, 1u) );
  37. BOOST_CHECK_EQUAL( 1u, boost::count(cref_cont, 1u) );
  38. BOOST_CHECK_EQUAL( 1u, boost::count(boost::make_iterator_range(cont), 1u) );
  39. cont += 2,3,4,5,6,7,8,9;
  40. BOOST_CHECK_EQUAL( 0u, boost::count(cont, 0u) );
  41. BOOST_CHECK_EQUAL( 0u, boost::count(cref_cont, 0u) );
  42. BOOST_CHECK_EQUAL( 0u, boost::count(boost::make_iterator_range(cont), 0u) );
  43. BOOST_CHECK_EQUAL( 1u, boost::count(cont, 1u) );
  44. BOOST_CHECK_EQUAL( 1u, boost::count(cref_cont, 1u) );
  45. BOOST_CHECK_EQUAL( 1u, boost::count(boost::make_iterator_range(cont), 1u) );
  46. cont += 2;
  47. BOOST_CHECK_EQUAL( 0u, boost::count(cont, 0u) );
  48. BOOST_CHECK_EQUAL( 0u, boost::count(cref_cont, 0u) );
  49. BOOST_CHECK_EQUAL( 0u, boost::count(boost::make_iterator_range(cont), 0u) );
  50. BOOST_CHECK_EQUAL( 1u, boost::count(cont, 1u) );
  51. BOOST_CHECK_EQUAL( 1u, boost::count(cref_cont, 1u) );
  52. BOOST_CHECK_EQUAL( 1u, boost::count(boost::make_iterator_range(cont), 1u) );
  53. BOOST_CHECK_EQUAL( 2u, boost::count(cont, 2u) );
  54. BOOST_CHECK_EQUAL( 2u, boost::count(cref_cont, 2u) );
  55. BOOST_CHECK_EQUAL( 2u, boost::count(boost::make_iterator_range(cont), 2u) );
  56. }
  57. void test_count()
  58. {
  59. test_count_impl< std::vector<int> >();
  60. test_count_impl< std::list<int> >();
  61. test_count_impl< std::multiset<int> >();
  62. }
  63. }
  64. }
  65. boost::unit_test::test_suite*
  66. init_unit_test_suite(int argc, char* argv[])
  67. {
  68. boost::unit_test::test_suite* test
  69. = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.count" );
  70. test->add( BOOST_TEST_CASE( &boost::test_count ) );
  71. return test;
  72. }