| 
									
										
										
										
											2017-06-27 16:43:17 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |    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>()); | 
					
						
							| 
									
										
										
										
											2017-06-28 10:04:25 -07:00
										 |  |  |     BOOST_CHECK(res == 40320);		// 8! will not fit into a char
 | 
					
						
							| 
									
										
										
										
											2017-06-27 16:43:17 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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(); | 
					
						
							|  |  |  | } |