| /* |
| Copyright (c) Marshall Clow 2013. |
| |
| Distributed under the Boost Software License, Version 1.0. (See accompanying |
| file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
| |
| For more information, see http://www.boost.org |
| */ |
| |
| #include <vector> |
| #include <functional> |
| |
| #include <boost/config.hpp> |
| #include <boost/algorithm/cxx17/reduce.hpp> |
| |
| #include "iterator_test.hpp" |
| |
| #define BOOST_TEST_MAIN |
| #include <boost/test/unit_test.hpp> |
| |
| namespace ba = boost::algorithm; |
| |
| template <class Iter, class T, class Op> |
| void |
| test_reduce(Iter first, Iter last, T init, Op op, T x) |
| { |
| BOOST_CHECK(ba::reduce(first, last, init, op) == x); |
| } |
| |
| template <class Iter, class T, class Op> |
| void |
| test_reduce(Iter first, Iter last, Op op, T x) |
| { |
| BOOST_CHECK(ba::reduce(first, last, op) == x); |
| } |
| |
| template <class Iter, class T> |
| void |
| test_reduce(Iter first, Iter last, T x) |
| { |
| BOOST_CHECK(ba::reduce(first, last) == x); |
| } |
| |
| template <class Iter> |
| void |
| test_init_op() |
| { |
| int ia[] = {1, 2, 3, 4, 5, 6}; |
| unsigned sa = sizeof(ia) / sizeof(ia[0]); |
| test_reduce(Iter(ia), Iter(ia), 0, std::plus<int>(), 0); |
| test_reduce(Iter(ia), Iter(ia), 1, std::multiplies<int>(), 1); |
| test_reduce(Iter(ia), Iter(ia+1), 0, std::plus<int>(), 1); |
| test_reduce(Iter(ia), Iter(ia+1), 2, std::multiplies<int>(), 2); |
| test_reduce(Iter(ia), Iter(ia+2), 0, std::plus<int>(), 3); |
| test_reduce(Iter(ia), Iter(ia+2), 3, std::multiplies<int>(), 6); |
| test_reduce(Iter(ia), Iter(ia+sa), 0, std::plus<int>(), 21); |
| test_reduce(Iter(ia), Iter(ia+sa), 4, std::multiplies<int>(), 2880); |
| } |
| |
| void test_reduce_init_op() |
| { |
| test_init_op<input_iterator<const int*> >(); |
| test_init_op<forward_iterator<const int*> >(); |
| test_init_op<bidirectional_iterator<const int*> >(); |
| test_init_op<random_access_iterator<const int*> >(); |
| test_init_op<const int*>(); |
| |
| { |
| char ia[] = {1, 2, 3, 4, 5, 6, 7, 8}; |
| unsigned sa = sizeof(ia) / sizeof(ia[0]); |
| unsigned res = boost::algorithm::reduce(ia, ia+sa, 1U, std::multiplies<unsigned>()); |
| BOOST_CHECK(res == 40320); // 8! will not fit into a char |
| } |
| } |
| |
| template <class Iter> |
| void |
| test_init() |
| { |
| int ia[] = {1, 2, 3, 4, 5, 6}; |
| unsigned sa = sizeof(ia) / sizeof(ia[0]); |
| test_reduce(Iter(ia), Iter(ia), 0, 0); |
| test_reduce(Iter(ia), Iter(ia), 1, 1); |
| test_reduce(Iter(ia), Iter(ia+1), 0, 1); |
| test_reduce(Iter(ia), Iter(ia+1), 2, 3); |
| test_reduce(Iter(ia), Iter(ia+2), 0, 3); |
| test_reduce(Iter(ia), Iter(ia+2), 3, 6); |
| test_reduce(Iter(ia), Iter(ia+sa), 0, 21); |
| test_reduce(Iter(ia), Iter(ia+sa), 4, 25); |
| } |
| |
| void test_reduce_init() |
| { |
| test_init<input_iterator<const int*> >(); |
| test_init<forward_iterator<const int*> >(); |
| test_init<bidirectional_iterator<const int*> >(); |
| test_init<random_access_iterator<const int*> >(); |
| test_init<const int*>(); |
| } |
| |
| |
| template <class Iter> |
| void |
| test() |
| { |
| int ia[] = {1, 2, 3, 4, 5, 6}; |
| unsigned sa = sizeof(ia) / sizeof(ia[0]); |
| test_reduce(Iter(ia), Iter(ia), 0); |
| test_reduce(Iter(ia), Iter(ia+1), 1); |
| test_reduce(Iter(ia), Iter(ia+2), 3); |
| test_reduce(Iter(ia), Iter(ia+sa), 21); |
| } |
| |
| void test_reduce() |
| { |
| test<input_iterator<const int*> >(); |
| test<forward_iterator<const int*> >(); |
| test<bidirectional_iterator<const int*> >(); |
| test<random_access_iterator<const int*> >(); |
| test<const int*>(); |
| } |
| |
| BOOST_AUTO_TEST_CASE( test_main ) |
| { |
| test_reduce(); |
| test_reduce_init(); |
| test_reduce_init_op(); |
| } |