test_range.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /* Boost.MultiIndex test for range().
  2. *
  3. * Copyright 2003-2015 Joaquin M Lopez Munoz.
  4. * Distributed under the Boost Software License, Version 1.0.
  5. * (See accompanying file LICENSE_1_0.txt or copy at
  6. * http://www.boost.org/LICENSE_1_0.txt)
  7. *
  8. * See http://www.boost.org/libs/multi_index for library home page.
  9. */
  10. #include "test_range.hpp"
  11. #include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
  12. #include <algorithm>
  13. #include <boost/bind.hpp>
  14. #include <boost/detail/lightweight_test.hpp>
  15. #include "pre_multi_index.hpp"
  16. #include <boost/multi_index_container.hpp>
  17. #include <boost/multi_index/identity.hpp>
  18. #include <boost/multi_index/ordered_index.hpp>
  19. #include <boost/preprocessor/seq/enum.hpp>
  20. #include <functional>
  21. using namespace boost::multi_index;
  22. typedef multi_index_container<int> int_set;
  23. typedef int_set::iterator int_set_iterator;
  24. #undef CHECK_RANGE
  25. #define CHECK_RANGE(p,check_seq) \
  26. {\
  27. int v[]={BOOST_PP_SEQ_ENUM(check_seq)};\
  28. std::size_t size_v=sizeof(v)/sizeof(int);\
  29. BOOST_TEST(std::size_t(std::distance((p).first,(p).second))==size_v);\
  30. BOOST_TEST(std::equal((p).first,(p).second,&v[0]));\
  31. }
  32. #undef CHECK_VOID_RANGE
  33. #define CHECK_VOID_RANGE(p) BOOST_TEST((p).first==(p).second)
  34. #undef BIND1ST
  35. #define BIND1ST(f,x) ::boost::bind(f,x,::boost::arg<1>())
  36. #undef BIND2ND
  37. #define BIND2ND(f,x) ::boost::bind(f,::boost::arg<1>(),x)
  38. void test_range()
  39. {
  40. int_set is;
  41. for(int i=1;i<=10;++i)is.insert(i);
  42. std::pair<int_set::iterator,int_set::iterator> p;
  43. p=is.range(unbounded,unbounded);
  44. CHECK_RANGE(p,(1)(2)(3)(4)(5)(6)(7)(8)(9)(10));
  45. p=is.range(
  46. BIND1ST(std::less<int>(),5), /* 5 < x */
  47. unbounded);
  48. CHECK_RANGE(p,(6)(7)(8)(9)(10));
  49. p=is.range(
  50. BIND1ST(std::less_equal<int>(),8), /* 8 <= x */
  51. unbounded);
  52. CHECK_RANGE(p,(8)(9)(10));
  53. p=is.range(
  54. BIND1ST(std::less_equal<int>(),11), /* 11 <= x */
  55. unbounded);
  56. CHECK_VOID_RANGE(p);
  57. p=is.range(
  58. unbounded,
  59. BIND2ND(std::less<int>(),8)); /* x < 8 */
  60. CHECK_RANGE(p,(1)(2)(3)(4)(5)(6)(7));
  61. p=is.range(
  62. unbounded,
  63. BIND2ND(std::less_equal<int>(),4)); /* x <= 4 */
  64. CHECK_RANGE(p,(1)(2)(3)(4));
  65. p=is.range(
  66. unbounded,
  67. BIND2ND(std::less_equal<int>(),0)); /* x <= 0 */
  68. CHECK_VOID_RANGE(p);
  69. p=is.range(
  70. BIND1ST(std::less<int>(),6), /* 6 < x */
  71. BIND2ND(std::less_equal<int>(),9)); /* x <= 9 */
  72. CHECK_RANGE(p,(7)(8)(9));
  73. p=is.range(
  74. BIND1ST(std::less_equal<int>(),4), /* 4 <= x */
  75. BIND2ND(std::less<int>(),5)); /* x < 5 */
  76. CHECK_RANGE(p,(4));
  77. p=is.range(
  78. BIND1ST(std::less_equal<int>(),10), /* 10 <= x */
  79. BIND2ND(std::less_equal<int>(),10)); /* x <= 10 */
  80. CHECK_RANGE(p,(10));
  81. p=is.range(
  82. BIND1ST(std::less<int>(),0), /* 0 < x */
  83. BIND2ND(std::less<int>(),11)); /* x < 11 */
  84. CHECK_RANGE(p,(1)(2)(3)(4)(5)(6)(7)(8)(9)(10));
  85. p=is.range(
  86. BIND1ST(std::less<int>(),7), /* 7 < x */
  87. BIND2ND(std::less_equal<int>(),7)); /* x <= 7 */
  88. CHECK_VOID_RANGE(p);
  89. BOOST_TEST(p.first==is.upper_bound(7));
  90. p=is.range(
  91. BIND1ST(std::less_equal<int>(),8), /* 8 <= x */
  92. BIND2ND(std::less<int>(),2)); /* x < 2 */
  93. CHECK_VOID_RANGE(p);
  94. BOOST_TEST(p.first==is.lower_bound(8));
  95. p=is.range(
  96. BIND1ST(std::less<int>(),4), /* 4 < x */
  97. BIND2ND(std::less<int>(),5)); /* x < 5 */
  98. CHECK_VOID_RANGE(p);
  99. BOOST_TEST(p.first!=is.end());
  100. }