upper_bound.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. // Copyright Neil Groves 2009. Use, modification and
  2. // distribution is subject to the Boost Software License, Version
  3. // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  4. // http://www.boost.org/LICENSE_1_0.txt)
  5. //
  6. //
  7. // For more information, see http://www.boost.org/libs/range/
  8. //
  9. #include <boost/range/algorithm/upper_bound.hpp>
  10. #include <boost/test/test_tools.hpp>
  11. #include <boost/test/unit_test.hpp>
  12. #include <boost/assign.hpp>
  13. #include <boost/bind.hpp>
  14. #include "../test_driver/range_return_test_driver.hpp"
  15. #include <algorithm>
  16. #include <functional>
  17. #include <list>
  18. #include <numeric>
  19. #include <deque>
  20. #include <vector>
  21. namespace boost_range_test_algorithm_upper_bound
  22. {
  23. class upper_bound_policy
  24. {
  25. public:
  26. template< class Container >
  27. BOOST_DEDUCED_TYPENAME boost::range_iterator<Container>::type
  28. test_iter(Container& cont)
  29. {
  30. typedef BOOST_DEDUCED_TYPENAME boost::range_iterator<Container>::type iter_t;
  31. iter_t result = boost::upper_bound(cont, 5);
  32. BOOST_CHECK( result == boost::upper_bound(boost::make_iterator_range(cont), 5) );
  33. return result;
  34. }
  35. template<boost::range_return_value result_type>
  36. struct test_range
  37. {
  38. template<class Container, class Policy>
  39. BOOST_DEDUCED_TYPENAME boost::range_return<Container,result_type>::type
  40. operator()(Policy&, Container& cont)
  41. {
  42. typedef BOOST_DEDUCED_TYPENAME boost::range_return<Container,result_type>::type result_t;
  43. result_t result = boost::upper_bound<result_type>(cont, 5);
  44. BOOST_CHECK( result == boost::upper_bound<result_type>(boost::make_iterator_range(cont), 5) );
  45. return result;
  46. }
  47. };
  48. template< class Container >
  49. BOOST_DEDUCED_TYPENAME boost::range_iterator<Container>::type
  50. reference(Container& cont)
  51. {
  52. return std::upper_bound(cont.begin(), cont.end(), 5);
  53. }
  54. };
  55. template< class BinaryPredicate >
  56. struct upper_bound_pred_policy
  57. {
  58. template< class Container >
  59. BOOST_DEDUCED_TYPENAME boost::range_iterator<Container>::type
  60. test_iter(Container& cont)
  61. {
  62. typedef BOOST_DEDUCED_TYPENAME boost::range_iterator<Container>::type iter_t;
  63. iter_t result = boost::upper_bound(cont, 5, BinaryPredicate());
  64. BOOST_CHECK( result == boost::upper_bound(boost::make_iterator_range(cont), 5, BinaryPredicate()) );
  65. return result;
  66. }
  67. template< boost::range_return_value result_type>
  68. struct test_range
  69. {
  70. template< class Container, class Policy >
  71. BOOST_DEDUCED_TYPENAME boost::range_return<Container,result_type>::type
  72. operator()(Policy& policy, Container& cont)
  73. {
  74. typedef BOOST_DEDUCED_TYPENAME boost::range_return<Container,result_type>::type result_t;
  75. result_t result = boost::upper_bound<result_type>(cont, 5, policy.pred());
  76. BOOST_CHECK( result == boost::upper_bound<result_type>(
  77. boost::make_iterator_range(cont), 5, policy.pred()) );
  78. return result;
  79. }
  80. };
  81. template<class Container>
  82. BOOST_DEDUCED_TYPENAME boost::range_iterator<Container>::type
  83. reference(Container& cont)
  84. {
  85. return std::upper_bound(
  86. cont.begin(), cont.end(), 5, BinaryPredicate());
  87. }
  88. BinaryPredicate& pred() { return m_pred; }
  89. private:
  90. BinaryPredicate m_pred;
  91. };
  92. template<class Container,
  93. class TestPolicy,
  94. class BinaryPredicate>
  95. void test_upper_bound_impl(TestPolicy policy, BinaryPredicate pred)
  96. {
  97. using namespace boost::assign;
  98. typedef BOOST_DEDUCED_TYPENAME boost::remove_const<Container>::type container_t;
  99. typedef BOOST_DEDUCED_TYPENAME Container::value_type value_t;
  100. boost::range_test::range_return_test_driver test_driver;
  101. container_t mcont;
  102. Container& cont = mcont;
  103. test_driver(cont, policy);
  104. mcont.clear();
  105. mcont += 1;
  106. std::vector<value_t> temp(mcont.begin(), mcont.end());
  107. std::sort(temp.begin(), temp.end(), pred);
  108. mcont.assign(temp.begin(), temp.end());
  109. test_driver(cont, policy);
  110. mcont.clear();
  111. mcont += 1,2,3,4,5,6,7,8,9;
  112. temp.assign(mcont.begin(), mcont.end());
  113. std::sort(temp.begin(), temp.end(), pred);
  114. mcont.assign(temp.begin(), temp.end());
  115. test_driver(cont, policy);
  116. }
  117. template<class Container>
  118. void test_upper_bound_impl()
  119. {
  120. test_upper_bound_impl<Container>(
  121. upper_bound_policy(),
  122. std::less<int>()
  123. );
  124. test_upper_bound_impl<Container>(
  125. upper_bound_pred_policy<std::less<int> >(),
  126. std::less<int>()
  127. );
  128. test_upper_bound_impl<Container>(
  129. upper_bound_pred_policy<std::greater<int> >(),
  130. std::greater<int>()
  131. );
  132. }
  133. void test_upper_bound()
  134. {
  135. test_upper_bound_impl< std::vector<int> >();
  136. test_upper_bound_impl< std::list<int> >();
  137. test_upper_bound_impl< std::deque<int> >();
  138. test_upper_bound_impl< const std::vector<int> >();
  139. test_upper_bound_impl< const std::list<int> >();
  140. test_upper_bound_impl< const std::deque<int> >();
  141. }
  142. }
  143. boost::unit_test::test_suite*
  144. init_unit_test_suite(int argc, char* argv[])
  145. {
  146. boost::unit_test::test_suite* test
  147. = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.upper_bound" );
  148. test->add( BOOST_TEST_CASE( &boost_range_test_algorithm_upper_bound::test_upper_bound ) );
  149. return test;
  150. }