| Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 1 | //===----------------------------------------------------------------------===// | 
|  | 2 | // | 
| Howard Hinnant | 5b08a8a | 2010-05-11 21:36:01 +0000 | [diff] [blame] | 3 | //                     The LLVM Compiler Infrastructure | 
| Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 4 | // | 
|  | 5 | // This file is distributed under the University of Illinois Open Source | 
|  | 6 | // License. See LICENSE.TXT for details. | 
|  | 7 | // | 
|  | 8 | //===----------------------------------------------------------------------===// | 
|  | 9 |  | 
|  | 10 | // <numeric> | 
|  | 11 |  | 
|  | 12 | // template <InputIterator Iter, MoveConstructible T, | 
|  | 13 | //           Callable<auto, const T&, Iter::reference> BinaryOperation> | 
|  | 14 | //   requires HasAssign<T, BinaryOperation::result_type> | 
|  | 15 | //         && CopyConstructible<BinaryOperation> | 
|  | 16 | //   T | 
|  | 17 | //   accumulate(Iter first, Iter last, T init, BinaryOperation binary_op); | 
|  | 18 |  | 
|  | 19 | #include <numeric> | 
|  | 20 | #include <functional> | 
|  | 21 | #include <cassert> | 
|  | 22 |  | 
|  | 23 | #include "../iterators.h" | 
|  | 24 |  | 
|  | 25 | template <class Iter, class T> | 
|  | 26 | void | 
|  | 27 | test(Iter first, Iter last, T init, T x) | 
|  | 28 | { | 
|  | 29 | assert(std::accumulate(first, last, init, std::multiplies<T>()) == x); | 
|  | 30 | } | 
|  | 31 |  | 
|  | 32 | template <class Iter> | 
|  | 33 | void | 
|  | 34 | test() | 
|  | 35 | { | 
|  | 36 | int ia[] = {1, 2, 3, 4, 5, 6}; | 
|  | 37 | unsigned sa = sizeof(ia) / sizeof(ia[0]); | 
|  | 38 | test(Iter(ia), Iter(ia), 1, 1); | 
|  | 39 | test(Iter(ia), Iter(ia), 10, 10); | 
|  | 40 | test(Iter(ia), Iter(ia+1), 1, 1); | 
|  | 41 | test(Iter(ia), Iter(ia+1), 10, 10); | 
|  | 42 | test(Iter(ia), Iter(ia+2), 1, 2); | 
|  | 43 | test(Iter(ia), Iter(ia+2), 10, 20); | 
|  | 44 | test(Iter(ia), Iter(ia+sa), 1, 720); | 
|  | 45 | test(Iter(ia), Iter(ia+sa), 10, 7200); | 
|  | 46 | } | 
|  | 47 |  | 
|  | 48 | int main() | 
|  | 49 | { | 
|  | 50 | test<input_iterator<const int*> >(); | 
|  | 51 | test<forward_iterator<const int*> >(); | 
|  | 52 | test<bidirectional_iterator<const int*> >(); | 
|  | 53 | test<random_access_iterator<const int*> >(); | 
|  | 54 | test<const int*>(); | 
|  | 55 | } |