1 /*
2 Copyright (c) Marshall Clow 2017.
3
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)
6
7 For more information, see http://www.boost.org
8 */
9
10 #include <vector>
11 #include <functional>
12 #include <numeric>
13 #include <algorithm>
14
15 #include <boost/config.hpp>
16 #include <boost/algorithm/cxx11/iota.hpp>
17 #include <boost/algorithm/cxx17/inclusive_scan.hpp>
18
19 #include "iterator_test.hpp"
20
21 #define BOOST_TEST_MAIN
22 #include <boost/test/unit_test.hpp>
23
24 namespace ba = boost::algorithm;
25
triangle(int n)26 int triangle(int n) { return n*(n+1)/2; }
27
basic_tests_op()28 void basic_tests_op()
29 {
30 {
31 std::vector<int> v(10);
32 std::fill(v.begin(), v.end(), 3);
33 ba::inclusive_scan(v.begin(), v.end(), v.begin(), std::plus<int>());
34 for (size_t i = 0; i < v.size(); ++i)
35 assert(v[i] == (int)(i+1) * 3);
36 }
37
38 {
39 std::vector<int> v(10);
40 ba::iota(v.begin(), v.end(), 0);
41 ba::inclusive_scan(v.begin(), v.end(), v.begin(), std::plus<int>());
42 for (size_t i = 0; i < v.size(); ++i)
43 assert(v[i] == triangle(i));
44 }
45
46 {
47 std::vector<int> v(10);
48 ba::iota(v.begin(), v.end(), 1);
49 ba::inclusive_scan(v.begin(), v.end(), v.begin(), std::plus<int>());
50 for (size_t i = 0; i < v.size(); ++i)
51 assert(v[i] == triangle(i + 1));
52 }
53
54 {
55 std::vector<int> v, res;
56 ba::inclusive_scan(v.begin(), v.end(), std::back_inserter(res), std::plus<int>());
57 assert(res.empty());
58 }
59 }
60
test_inclusive_scan_op()61 void test_inclusive_scan_op()
62 {
63 basic_tests_op();
64 BOOST_CHECK(true);
65 }
66
basic_tests_init()67 void basic_tests_init()
68 {
69 {
70 std::vector<int> v(10);
71 std::fill(v.begin(), v.end(), 3);
72 ba::inclusive_scan(v.begin(), v.end(), v.begin(), std::plus<int>(), 50);
73 for (size_t i = 0; i < v.size(); ++i)
74 assert(v[i] == 50 + (int)(i+1) * 3);
75 }
76
77 {
78 std::vector<int> v(10);
79 ba::iota(v.begin(), v.end(), 0);
80 ba::inclusive_scan(v.begin(), v.end(), v.begin(), std::plus<int>(), 40);
81 for (size_t i = 0; i < v.size(); ++i)
82 assert(v[i] == 40 + triangle(i));
83 }
84
85 {
86 std::vector<int> v(10);
87 ba::iota(v.begin(), v.end(), 1);
88 ba::inclusive_scan(v.begin(), v.end(), v.begin(), std::plus<int>(), 30);
89 for (size_t i = 0; i < v.size(); ++i)
90 assert(v[i] == 30 + triangle(i + 1));
91 }
92
93 {
94 std::vector<int> v, res;
95 ba::inclusive_scan(v.begin(), v.end(), std::back_inserter(res), std::plus<int>(), 40);
96 assert(res.empty());
97 }
98 }
99
100
test_inclusive_scan_init()101 void test_inclusive_scan_init()
102 {
103 basic_tests_init();
104 BOOST_CHECK(true);
105 }
106
basic_tests_op_init()107 void basic_tests_op_init()
108 {
109 {
110 std::vector<int> v(10);
111 std::fill(v.begin(), v.end(), 3);
112 ba::inclusive_scan(v.begin(), v.end(), v.begin(), std::plus<int>(), 50);
113 for (size_t i = 0; i < v.size(); ++i)
114 BOOST_CHECK(v[i] == 50 + (int)(i+1) * 3);
115 }
116
117 {
118 std::vector<int> v(10);
119 ba::iota(v.begin(), v.end(), 0);
120 ba::inclusive_scan(v.begin(), v.end(), v.begin(), std::plus<int>(), 40);
121 for (size_t i = 0; i < v.size(); ++i)
122 BOOST_CHECK(v[i] == 40 + triangle(i));
123 }
124
125 {
126 std::vector<int> v(10);
127 ba::iota(v.begin(), v.end(), 1);
128 ba::inclusive_scan(v.begin(), v.end(), v.begin(), std::plus<int>(), 30);
129 for (size_t i = 0; i < v.size(); ++i)
130 BOOST_CHECK(v[i] == 30 + triangle(i + 1));
131 }
132
133 {
134 std::vector<int> v, res;
135 ba::inclusive_scan(v.begin(), v.end(), std::back_inserter(res), std::plus<int>(), 40);
136 BOOST_CHECK(res.empty());
137 }
138 }
139
test_inclusive_scan_op_init()140 void test_inclusive_scan_op_init()
141 {
142 basic_tests_op_init();
143 BOOST_CHECK(true);
144 }
145
146
147
BOOST_AUTO_TEST_CASE(test_main)148 BOOST_AUTO_TEST_CASE( test_main )
149 {
150 test_inclusive_scan_op();
151 test_inclusive_scan_init();
152 test_inclusive_scan_op_init();
153 }
154