]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/sort/test/float_sort_test.cpp
1 // Boost Sort library float_sort_test.cpp file -----------------------------//
3 // Copyright Steven Ross 2014. Use, modification and
4 // distribution is subject to the Boost Software License, Version
5 // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
6 // http://www.boost.org/LICENSE_1_0.txt)
8 // See http://www.boost.org/libs/sort for library home page.
10 #include <boost/sort/spreadsort/spreadsort.hpp>
11 // Include unit test framework
12 #include <boost/test/included/test_exec_monitor.hpp>
13 #include <boost/test/test_tools.hpp>
18 using namespace boost::sort::spreadsort
;
20 //Casting to an integer before bitshifting
22 int operator()(const float &x
, const unsigned offset
) const {
23 return float_mem_cast
<float, int>(x
) >> offset
;
27 struct rightshift_64
{
28 boost::int64_t operator()(const double &x
, const boost::uint64_t offset
) const
30 return float_mem_cast
<double, boost::int64_t>(x
) >> offset
;
35 rand_32(bool sign
= true) {
36 boost::int32_t result
= rand() | (rand()<< 16);
40 if (sign
&& (rand() % 2))
45 static const unsigned input_count
= 1000000;
47 // Helper class to run tests across all float_sort interface variants.
48 template<class FloatType
, class RightShift
>
49 void test_vector(vector
<FloatType
> base_vec
, RightShift shifter
) {
50 vector
<FloatType
> sorted_vec
= base_vec
;
51 vector
<FloatType
> test_vec
= base_vec
;
52 std::sort(sorted_vec
.begin(), sorted_vec
.end());
53 //Testing boost::sort::spreadsort version
55 boost::sort::spreadsort::spreadsort(test_vec
.begin(), test_vec
.end());
56 BOOST_CHECK(test_vec
== sorted_vec
);
59 float_sort(test_vec
.begin(), test_vec
.end(), shifter
);
60 BOOST_CHECK(test_vec
== sorted_vec
);
63 float_sort(test_vec
.begin(), test_vec
.end(), shifter
, less
<FloatType
>());
64 BOOST_CHECK(test_vec
== sorted_vec
);
70 vector
<float> base_vec
;
72 //Generating semirandom numbers that will work for basic testing
73 for (unsigned u
= 0; u
< input_count
; ++u
) {
74 float val
= float(rand_32());
75 //As std::sort gives arbitrary results for NaNs and 0.0 vs. -0.0, treat all
76 //those as just 0.0 for testing
77 if (!(val
< 0.0) && !(0.0 < val
))
78 base_vec
.push_back(0.0);
80 base_vec
.push_back(val
);
82 test_vector(base_vec
, rightshift());
84 // Trying both positive and negative sorted and reverse sorted data.
86 for (size_t i
= 0; i
< input_count
; ++i
) base_vec
.push_back(-i
);
87 test_vector(base_vec
, rightshift());
89 for (size_t i
= 0; i
< input_count
; ++i
) base_vec
.push_back(i
- input_count
);
90 test_vector(base_vec
, rightshift());
92 for (size_t i
= 0; i
< input_count
; ++i
) base_vec
.push_back(input_count
- i
);
93 test_vector(base_vec
, rightshift());
95 for (size_t i
= 0; i
< input_count
; ++i
) base_vec
.push_back(i
);
96 test_vector(base_vec
, rightshift());
98 for (size_t i
= 0; i
< input_count
; ++i
) base_vec
.push_back(i
);
99 for (size_t i
= 0; i
< input_count
; i
+= 2) base_vec
[i
] *= -1;
100 test_vector(base_vec
, rightshift());
104 vector
<double> base_vec
;
105 for (unsigned u
= 0; u
< input_count
; ++u
) {
107 ((((boost::int64_t)rand_32()) << ((8 * sizeof(int)) -1)) + rand_32(false));
108 //As std::sort gives arbitrary results for NaNs and 0.0 vs. -0.0,
109 //treat all those as just 0.0 for testing
110 if (!(val
< 0.0) && !(0.0 < val
))
111 base_vec
.push_back(0.0);
113 base_vec
.push_back(val
);
115 test_vector(base_vec
, rightshift_64());
117 // Trying both positive and negative sorted and reverse sorted data.
119 for (size_t i
= 0; i
< input_count
; ++i
) base_vec
.push_back(-i
);
120 test_vector(base_vec
, rightshift_64());
122 for (size_t i
= 0; i
< input_count
; ++i
) base_vec
.push_back(i
- input_count
);
123 test_vector(base_vec
, rightshift_64());
125 for (size_t i
= 0; i
< input_count
; ++i
) base_vec
.push_back(input_count
- i
);
126 test_vector(base_vec
, rightshift_64());
128 for (size_t i
= 0; i
< input_count
; ++i
) base_vec
.push_back(i
);
129 test_vector(base_vec
, rightshift_64());
131 for (size_t i
= 0; i
< input_count
; ++i
) base_vec
.push_back(i
);
132 for (size_t i
= 0; i
< input_count
; i
+= 2) base_vec
[i
] *= -1;
133 test_vector(base_vec
, rightshift_64());
136 // Verify that 0 and 1 elements work correctly.
138 vector
<float> test_vec
;
139 boost::sort::spreadsort::spreadsort(test_vec
.begin(), test_vec
.end());
140 const float test_value
= -0.0;
141 test_vec
.push_back(test_value
);
142 boost::sort::spreadsort::spreadsort(test_vec
.begin(), test_vec
.end());
143 BOOST_CHECK(test_vec
.size() == 1);
144 BOOST_CHECK(test_vec
[0] == test_value
);
148 int test_main( int, char*[] )