• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Boost.MultiIndex test for range().
2  *
3  * Copyright 2003-2020 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 
11 #include "test_range.hpp"
12 
13 #include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
14 #include <algorithm>
15 #include <boost/bind/bind.hpp>
16 #include <boost/detail/lightweight_test.hpp>
17 #include "pre_multi_index.hpp"
18 #include <boost/multi_index_container.hpp>
19 #include <boost/multi_index/identity.hpp>
20 #include <boost/multi_index/ordered_index.hpp>
21 #include <boost/preprocessor/seq/enum.hpp>
22 #include <functional>
23 
24 using namespace boost::multi_index;
25 
26 typedef multi_index_container<int>  int_set;
27 typedef int_set::iterator int_set_iterator;
28 
29 #undef CHECK_RANGE
30 #define CHECK_RANGE(p,check_seq) \
31 {\
32   int v[]={BOOST_PP_SEQ_ENUM(check_seq)};\
33   std::size_t size_v=sizeof(v)/sizeof(int);\
34   BOOST_TEST(std::size_t(std::distance((p).first,(p).second))==size_v);\
35   BOOST_TEST(std::equal((p).first,(p).second,&v[0]));\
36 }
37 
38 #undef CHECK_VOID_RANGE
39 #define CHECK_VOID_RANGE(p) BOOST_TEST((p).first==(p).second)
40 
41 #undef BIND1ST
42 #define BIND1ST(f,x) ::boost::bind<bool>(f,x,::boost::arg<1>())
43 
44 #undef BIND2ND
45 #define BIND2ND(f,x) ::boost::bind<bool>(f,::boost::arg<1>(),x)
46 
test_range()47 void test_range()
48 {
49   int_set is;
50 
51   for(int i=1;i<=10;++i)is.insert(i);
52 
53   std::pair<int_set::iterator,int_set::iterator> p;
54 
55   p=is.range(unbounded,unbounded);
56   CHECK_RANGE(p,(1)(2)(3)(4)(5)(6)(7)(8)(9)(10));
57 
58   p=is.range(
59     BIND1ST(std::less<int>(),5), /* 5 < x */
60     unbounded);
61   CHECK_RANGE(p,(6)(7)(8)(9)(10));
62 
63   p=is.range(
64     BIND1ST(std::less_equal<int>(),8), /* 8 <= x */
65     unbounded);
66   CHECK_RANGE(p,(8)(9)(10));
67 
68   p=is.range(
69     BIND1ST(std::less_equal<int>(),11), /* 11 <= x */
70     unbounded);
71   CHECK_VOID_RANGE(p);
72 
73   p=is.range(
74     unbounded,
75     BIND2ND(std::less<int>(),8)); /* x < 8 */
76   CHECK_RANGE(p,(1)(2)(3)(4)(5)(6)(7));
77 
78   p=is.range(
79     unbounded,
80     BIND2ND(std::less_equal<int>(),4)); /* x <= 4 */
81   CHECK_RANGE(p,(1)(2)(3)(4));
82 
83   p=is.range(
84     unbounded,
85     BIND2ND(std::less_equal<int>(),0)); /* x <= 0 */
86   CHECK_VOID_RANGE(p);
87 
88   p=is.range(
89     BIND1ST(std::less<int>(),6),        /* 6 <  x */
90     BIND2ND(std::less_equal<int>(),9)); /* x <= 9 */
91   CHECK_RANGE(p,(7)(8)(9));
92 
93   p=is.range(
94     BIND1ST(std::less_equal<int>(),4), /* 4 <= x */
95     BIND2ND(std::less<int>(),5));      /* x <  5 */
96   CHECK_RANGE(p,(4));
97 
98   p=is.range(
99     BIND1ST(std::less_equal<int>(),10),  /* 10 <=  x */
100     BIND2ND(std::less_equal<int>(),10)); /*  x <= 10 */
101   CHECK_RANGE(p,(10));
102 
103   p=is.range(
104     BIND1ST(std::less<int>(),0),   /* 0 <  x */
105     BIND2ND(std::less<int>(),11)); /* x < 11 */
106   CHECK_RANGE(p,(1)(2)(3)(4)(5)(6)(7)(8)(9)(10));
107 
108   p=is.range(
109     BIND1ST(std::less<int>(),7),        /* 7 <  x */
110     BIND2ND(std::less_equal<int>(),7)); /* x <= 7 */
111   CHECK_VOID_RANGE(p);
112   BOOST_TEST(p.first==is.upper_bound(7));
113 
114   p=is.range(
115     BIND1ST(std::less_equal<int>(),8), /* 8 <= x */
116     BIND2ND(std::less<int>(),2));      /* x <  2 */
117   CHECK_VOID_RANGE(p);
118   BOOST_TEST(p.first==is.lower_bound(8));
119 
120   p=is.range(
121     BIND1ST(std::less<int>(),4),  /* 4 < x */
122     BIND2ND(std::less<int>(),5)); /* x < 5 */
123   CHECK_VOID_RANGE(p);
124   BOOST_TEST(p.first!=is.end());
125 }
126