]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/multi_index/test/test_range.cpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / multi_index / test / test_range.cpp
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
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.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(f,x,::boost::arg<1>())
43
44 #undef BIND2ND
45 #define BIND2ND(f,x) ::boost::bind(f,::boost::arg<1>(),x)
46
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 }