]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/algorithm/test/ordered_test.cpp
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / libs / algorithm / test / ordered_test.cpp
CommitLineData
7c673cae
FG
1// Copyright (c) 2010 Nuovation System Designs, LLC
2// Grant Erickson <gerickson@nuovations.com>
3//
4// Reworked by Marshall Clow; August 2010
5//
6// Distributed under the Boost Software License, Version 1.0. (See
7// accompanying file LICENSE_1_0.txt or copy at
8// http://www.boost.org/LICENSE_1_0.txt)
9//
10// See http://www.boost.org/ for latest version.
11
12#include <algorithm>
13#include <iostream>
14
15#include <boost/algorithm/cxx11/is_sorted.hpp>
16
17#define BOOST_TEST_MAIN
18#include <boost/test/unit_test.hpp>
19
20using namespace boost;
21
22/* Preprocessor Defines */
23
24#define elementsof(v) (sizeof (v) / sizeof (v[0]))
25#define a_begin(v) (&v[0])
26#define a_end(v) (v + elementsof (v))
27#define a_range(v) v
28#define b_e(v) a_begin(v),a_end(v)
29
30namespace ba = boost::algorithm;
31
92f5a8d4
TL
32BOOST_CXX14_CONSTEXPR bool less( int x, int y ) { return x < y; }
33
7c673cae
FG
34static void
35test_ordered(void)
36{
92f5a8d4
TL
37 BOOST_CXX14_CONSTEXPR const int strictlyIncreasingValues[] = { 1, 2, 3, 4, 5 };
38 BOOST_CXX14_CONSTEXPR const int randomValues[] = { 3, 6, 1, 2, 7 };
7c673cae
FG
39 const int constantValues[] = { 1, 2, 2, 2, 5 };
40 int nonConstantArray[] = { 1, 2, 2, 2, 5 };
41 const int inOrderUntilTheEnd [] = { 0, 1, 2, 3, 4, 5, 6, 7, 6 };
42
43// Begin/end checks
44 BOOST_CHECK ( ba::is_sorted (b_e(strictlyIncreasingValues)));
45 BOOST_CHECK ( !ba::is_sorted (b_e(randomValues)));
46 BOOST_CHECK ( ba::is_sorted (b_e(strictlyIncreasingValues), std::less<int>()));
47 BOOST_CHECK ( !ba::is_sorted (b_e(strictlyIncreasingValues), std::greater<int>()));
48
49// Range checks
50 BOOST_CHECK ( ba::is_sorted (a_range(strictlyIncreasingValues)));
51 BOOST_CHECK ( !ba::is_sorted (a_range(randomValues)));
52 BOOST_CHECK ( ba::is_sorted (a_range(strictlyIncreasingValues), std::less<int>()));
53 BOOST_CHECK ( !ba::is_sorted (a_range(strictlyIncreasingValues), std::greater<int>()));
54
55 BOOST_CHECK ( ba::is_sorted_until ( b_e(strictlyIncreasingValues)) == a_end(strictlyIncreasingValues));
56 BOOST_CHECK ( ba::is_sorted_until ( b_e(strictlyIncreasingValues), std::less<int>()) == a_end(strictlyIncreasingValues));
57 BOOST_CHECK ( ba::is_sorted_until ( a_range(strictlyIncreasingValues)) == boost::end(strictlyIncreasingValues));
58 BOOST_CHECK ( ba::is_sorted_until ( a_range(strictlyIncreasingValues), std::less<int>()) == boost::end(strictlyIncreasingValues));
59
60// Check for const and non-const arrays
61 BOOST_CHECK ( ba::is_sorted_until ( b_e(constantValues), std::less<int>()) == a_end(constantValues));
62 BOOST_CHECK ( ba::is_sorted_until ( a_range(constantValues), std::less<int>()) == boost::end(constantValues));
63 BOOST_CHECK ( ba::is_sorted_until ( b_e(nonConstantArray), std::less<int>()) == a_end(nonConstantArray));
64 BOOST_CHECK ( ba::is_sorted_until ( a_range(nonConstantArray), std::less<int>()) == boost::end(nonConstantArray));
65
66 BOOST_CHECK ( ba::is_sorted_until ( b_e(randomValues), std::less<int>()) == &randomValues[2] );
67 BOOST_CHECK ( ba::is_sorted_until ( b_e(randomValues)) == &randomValues[2] );
68 BOOST_CHECK ( ba::is_sorted_until ( a_range(randomValues), std::less<int>()) == &randomValues[2] );
69 BOOST_CHECK ( ba::is_sorted_until ( a_range(randomValues)) == &randomValues[2] );
70
71 BOOST_CHECK ( ba::is_sorted_until ( a_range(inOrderUntilTheEnd), std::less<int>()) == &inOrderUntilTheEnd[8] );
72 BOOST_CHECK ( ba::is_sorted_until ( a_range(inOrderUntilTheEnd)) == &inOrderUntilTheEnd[8] );
73
74// For zero and one element collections, the comparison predicate should never be called
75 BOOST_CHECK ( ba::is_sorted_until ( a_begin(randomValues), a_begin(randomValues), std::equal_to<int>()) == a_begin(randomValues));
76 BOOST_CHECK ( ba::is_sorted_until ( a_begin(randomValues), a_begin(randomValues)) == a_begin(randomValues));
77 BOOST_CHECK ( ba::is_sorted_until ( a_begin(randomValues), a_begin(randomValues) + 1, std::equal_to<int>()) == a_begin(randomValues) + 1);
78 BOOST_CHECK ( ba::is_sorted_until ( a_begin(randomValues), a_begin(randomValues) + 1 ) == a_begin(randomValues) + 1);
92f5a8d4
TL
79
80 BOOST_CXX14_CONSTEXPR bool constexpr_res = (
81 ba::is_sorted ( boost::begin(strictlyIncreasingValues), boost::end(strictlyIncreasingValues) )
82 && !ba::is_sorted (a_range(randomValues))
83 && ba::is_sorted_until ( boost::begin(strictlyIncreasingValues), boost::end(strictlyIncreasingValues), less) == a_end(strictlyIncreasingValues)
84 && ba::is_sorted_until ( randomValues, less) == &randomValues[2]
85 );
86 BOOST_CHECK ( constexpr_res );
7c673cae
FG
87}
88
89
90static void
91test_increasing_decreasing(void)
92{
92f5a8d4
TL
93 BOOST_CXX14_CONSTEXPR const int strictlyIncreasingValues[] = { 1, 2, 3, 4, 5 };
94 BOOST_CXX14_CONSTEXPR const int strictlyDecreasingValues[] = { 9, 8, 7, 6, 5 };
95 BOOST_CXX14_CONSTEXPR const int increasingValues[] = { 1, 2, 2, 2, 5 };
96 BOOST_CXX14_CONSTEXPR const int decreasingValues[] = { 9, 7, 7, 7, 5 };
97 BOOST_CXX14_CONSTEXPR const int randomValues[] = { 3, 6, 1, 2, 7 };
98 BOOST_CXX14_CONSTEXPR const int constantValues[] = { 7, 7, 7, 7, 7 };
7c673cae
FG
99
100 // Test a strictly increasing sequence
101 BOOST_CHECK ( ba::is_strictly_increasing (b_e(strictlyIncreasingValues)));
102 BOOST_CHECK ( ba::is_increasing (b_e(strictlyIncreasingValues)));
103 BOOST_CHECK ( !ba::is_strictly_decreasing (b_e(strictlyIncreasingValues)));
104 BOOST_CHECK ( !ba::is_decreasing (b_e(strictlyIncreasingValues)));
105
106 BOOST_CHECK ( ba::is_strictly_increasing (a_range(strictlyIncreasingValues)));
107 BOOST_CHECK ( ba::is_increasing (a_range(strictlyIncreasingValues)));
108 BOOST_CHECK ( !ba::is_strictly_decreasing (a_range(strictlyIncreasingValues)));
109 BOOST_CHECK ( !ba::is_decreasing (a_range(strictlyIncreasingValues)));
110
111 // Test a strictly decreasing sequence
112 BOOST_CHECK ( !ba::is_strictly_increasing (b_e(strictlyDecreasingValues)));
113 BOOST_CHECK ( !ba::is_increasing (b_e(strictlyDecreasingValues)));
114 BOOST_CHECK ( ba::is_strictly_decreasing (b_e(strictlyDecreasingValues)));
115 BOOST_CHECK ( ba::is_decreasing (b_e(strictlyDecreasingValues)));
116
117 // Test an increasing sequence
118 BOOST_CHECK ( !ba::is_strictly_increasing (b_e(increasingValues)));
119 BOOST_CHECK ( ba::is_increasing (b_e(increasingValues)));
120 BOOST_CHECK ( !ba::is_strictly_decreasing (b_e(increasingValues)));
121 BOOST_CHECK ( !ba::is_decreasing (b_e(increasingValues)));
122
123 // Test a decreasing sequence
124 BOOST_CHECK ( !ba::is_strictly_increasing (b_e(decreasingValues)));
125 BOOST_CHECK ( !ba::is_increasing (b_e(decreasingValues)));
126 BOOST_CHECK ( !ba::is_strictly_decreasing (b_e(decreasingValues)));
127 BOOST_CHECK ( ba::is_decreasing (b_e(decreasingValues)));
128
129 // Test a random sequence
130 BOOST_CHECK ( !ba::is_strictly_increasing (b_e(randomValues)));
131 BOOST_CHECK ( !ba::is_increasing (b_e(randomValues)));
132 BOOST_CHECK ( !ba::is_strictly_decreasing (b_e(randomValues)));
133 BOOST_CHECK ( !ba::is_decreasing (b_e(randomValues)));
134
135 // Test a constant sequence
136 BOOST_CHECK ( !ba::is_strictly_increasing (b_e(constantValues)));
137 BOOST_CHECK ( ba::is_increasing (b_e(constantValues)));
138 BOOST_CHECK ( !ba::is_strictly_decreasing (b_e(constantValues)));
139 BOOST_CHECK ( ba::is_decreasing (b_e(constantValues)));
140
141 // Test an empty sequence
142 BOOST_CHECK ( ba::is_strictly_increasing (strictlyIncreasingValues, strictlyIncreasingValues));
143 BOOST_CHECK ( ba::is_increasing (strictlyIncreasingValues, strictlyIncreasingValues));
144 BOOST_CHECK ( ba::is_strictly_decreasing (strictlyIncreasingValues, strictlyIncreasingValues));
145 BOOST_CHECK ( ba::is_decreasing (strictlyIncreasingValues, strictlyIncreasingValues));
146
147 // Test a one-element sequence
148 BOOST_CHECK ( ba::is_strictly_increasing (strictlyIncreasingValues, strictlyIncreasingValues+1));
149 BOOST_CHECK ( ba::is_increasing (strictlyIncreasingValues, strictlyIncreasingValues+1));
150 BOOST_CHECK ( ba::is_strictly_decreasing (strictlyIncreasingValues, strictlyIncreasingValues+1));
151 BOOST_CHECK ( ba::is_decreasing (strictlyIncreasingValues, strictlyIncreasingValues+1));
152
153 // Test a two-element sequence
154 BOOST_CHECK ( ba::is_strictly_increasing (strictlyIncreasingValues, strictlyIncreasingValues+2));
155 BOOST_CHECK ( ba::is_increasing (strictlyIncreasingValues, strictlyIncreasingValues+2));
156 BOOST_CHECK ( !ba::is_strictly_decreasing (strictlyIncreasingValues, strictlyIncreasingValues+2));
157 BOOST_CHECK ( !ba::is_decreasing (strictlyIncreasingValues, strictlyIncreasingValues+2));
158
92f5a8d4
TL
159 BOOST_CXX14_CONSTEXPR bool constexpr_res = (
160 ba::is_increasing (boost::begin(increasingValues), boost::end(increasingValues))
161 && ba::is_decreasing (boost::begin(decreasingValues), boost::end(decreasingValues))
162 && ba::is_strictly_increasing (boost::begin(strictlyIncreasingValues), boost::end(strictlyIncreasingValues))
163 && ba::is_strictly_decreasing (boost::begin(strictlyDecreasingValues), boost::end(strictlyDecreasingValues))
164 && !ba::is_strictly_increasing (boost::begin(increasingValues), boost::end(increasingValues))
165 && !ba::is_strictly_decreasing (boost::begin(decreasingValues), boost::end(decreasingValues))
166 );
167 BOOST_CHECK ( constexpr_res );
7c673cae
FG
168}
169
170BOOST_AUTO_TEST_CASE( test_main )
171{
172 test_ordered ();
173 test_increasing_decreasing ();
174}