]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/algorithm/test/transform_exclusive_scan_test.cpp
2 Copyright (c) Marshall Clow 2017.
4 Distributed under the Boost Software License, Version 1.0. (See accompanying
5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 For more information, see http://www.boost.org
14 #include <boost/config.hpp>
15 #include <boost/algorithm/cxx11/iota.hpp>
16 #include <boost/algorithm/cxx17/transform_exclusive_scan.hpp>
18 #include "iterator_test.hpp"
20 #define BOOST_TEST_MAIN
21 #include <boost/test/unit_test.hpp>
23 namespace ba
= boost::algorithm
;
25 int triangle(int n
) { return n
*(n
+1)/2; }
30 const _Tp
& operator()(const _Tp
& __x
) const { return __x
;}
34 template <class Iter1
, class BOp
, class UOp
, class T
, class Iter2
>
36 test(Iter1 first
, Iter1 last
, BOp bop
, UOp uop
, T init
, Iter2 rFirst
, Iter2 rLast
)
38 std::vector
<typename
std::iterator_traits
<Iter1
>::value_type
> v
;
40 ba::transform_exclusive_scan(first
, last
, std::back_inserter(v
), init
, bop
, uop
);
41 BOOST_CHECK(std::distance(rFirst
, rLast
) == v
.size());
42 BOOST_CHECK(std::equal(v
.begin(), v
.end(), rFirst
));
46 v
.assign(first
, last
);
47 ba::transform_exclusive_scan(v
.begin(), v
.end(), v
.begin(), init
, bop
, uop
);
48 BOOST_CHECK(std::distance(rFirst
, rLast
) == v
.size());
49 BOOST_CHECK(std::equal(v
.begin(), v
.end(), rFirst
));
57 int ia
[] = { 1, 3, 5, 7, 9};
58 const int pResI0
[] = { 0, 1, 4, 9, 16}; // with identity
59 const int mResI0
[] = { 0, 0, 0, 0, 0};
60 const int pResN0
[] = { 0, -1, -4, -9, -16}; // with negate
61 const int mResN0
[] = { 0, 0, 0, 0, 0};
62 const int pResI2
[] = { 2, 3, 6, 11, 18}; // with identity
63 const int mResI2
[] = { 2, 2, 6, 30, 210};
64 const int pResN2
[] = { 2, 1, -2, -7, -14}; // with negate
65 const int mResN2
[] = { 2, -2, 6, -30, 210};
66 const unsigned sa
= sizeof(ia
) / sizeof(ia
[0]);
67 BOOST_CHECK(sa
== sizeof(pResI0
) / sizeof(pResI0
[0])); // just to be sure
68 BOOST_CHECK(sa
== sizeof(mResI0
) / sizeof(mResI0
[0])); // just to be sure
69 BOOST_CHECK(sa
== sizeof(pResN0
) / sizeof(pResN0
[0])); // just to be sure
70 BOOST_CHECK(sa
== sizeof(mResN0
) / sizeof(mResN0
[0])); // just to be sure
71 BOOST_CHECK(sa
== sizeof(pResI2
) / sizeof(pResI2
[0])); // just to be sure
72 BOOST_CHECK(sa
== sizeof(mResI2
) / sizeof(mResI2
[0])); // just to be sure
73 BOOST_CHECK(sa
== sizeof(pResN2
) / sizeof(pResN2
[0])); // just to be sure
74 BOOST_CHECK(sa
== sizeof(mResN2
) / sizeof(mResN2
[0])); // just to be sure
76 for (unsigned int i
= 0; i
< sa
; ++i
) {
77 test(Iter(ia
), Iter(ia
+ i
), std::plus
<int>(), identity
<int>(), 0, pResI0
, pResI0
+ i
);
78 test(Iter(ia
), Iter(ia
+ i
), std::multiplies
<int>(), identity
<int>(), 0, mResI0
, mResI0
+ i
);
79 test(Iter(ia
), Iter(ia
+ i
), std::plus
<int>(), std::negate
<int>(), 0, pResN0
, pResN0
+ i
);
80 test(Iter(ia
), Iter(ia
+ i
), std::multiplies
<int>(), std::negate
<int>(), 0, mResN0
, mResN0
+ i
);
81 test(Iter(ia
), Iter(ia
+ i
), std::plus
<int>(), identity
<int>(), 2, pResI2
, pResI2
+ i
);
82 test(Iter(ia
), Iter(ia
+ i
), std::multiplies
<int>(), identity
<int>(), 2, mResI2
, mResI2
+ i
);
83 test(Iter(ia
), Iter(ia
+ i
), std::plus
<int>(), std::negate
<int>(), 2, pResN2
, pResN2
+ i
);
84 test(Iter(ia
), Iter(ia
+ i
), std::multiplies
<int>(), std::negate
<int>(), 2, mResN2
, mResN2
+ i
);
91 std::vector
<int> v(10);
92 std::fill(v
.begin(), v
.end(), 3);
93 ba::transform_exclusive_scan(v
.begin(), v
.end(), v
.begin(), 50, std::plus
<int>(), identity
<int>());
94 for (size_t i
= 0; i
< v
.size(); ++i
)
95 BOOST_CHECK(v
[i
] == 50 + (int) i
* 3);
99 std::vector
<int> v(10);
100 ba::iota(v
.begin(), v
.end(), 0);
101 ba::transform_exclusive_scan(v
.begin(), v
.end(), v
.begin(), 30, std::plus
<int>(), identity
<int>());
102 for (size_t i
= 0; i
< v
.size(); ++i
)
103 BOOST_CHECK(v
[i
] == 30 + triangle(i
-1));
107 std::vector
<int> v(10);
108 ba::iota(v
.begin(), v
.end(), 1);
109 ba::transform_exclusive_scan(v
.begin(), v
.end(), v
.begin(), 40, std::plus
<int>(), identity
<int>());
110 for (size_t i
= 0; i
< v
.size(); ++i
)
111 BOOST_CHECK(v
[i
] == 40 + triangle(i
));
115 std::vector
<int> v
, res
;
116 ba::transform_exclusive_scan(v
.begin(), v
.end(), std::back_inserter(res
), 40, std::plus
<int>(), identity
<int>());
117 BOOST_CHECK(res
.empty());
122 void test_transform_exclusive_scan_init()
125 // All the iterator categories
126 test
<input_iterator
<const int*> >();
127 test
<forward_iterator
<const int*> >();
128 test
<bidirectional_iterator
<const int*> >();
129 test
<random_access_iterator
<const int*> >();
134 BOOST_AUTO_TEST_CASE( test_main
)
136 test_transform_exclusive_scan_init();