1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 // <numeric> 10 // UNSUPPORTED: clang-8 11 // UNSUPPORTED: gcc-9 12 13 // Became constexpr in C++20 14 // template <InputIterator InIter, OutputIterator<auto, const InIter::value_type&> OutIter> 15 // requires HasPlus<InIter::value_type, InIter::reference> 16 // && HasAssign<InIter::value_type, 17 // HasPlus<InIter::value_type, InIter::reference>::result_type> 18 // && Constructible<InIter::value_type, InIter::reference> 19 // OutIter 20 // partial_sum(InIter first, InIter last, OutIter result); 21 22 #include <numeric> 23 #include <cassert> 24 25 #include "test_macros.h" 26 #include "test_iterators.h" 27 28 template <class InIter, class OutIter> 29 TEST_CONSTEXPR_CXX20 void 30 test() 31 { 32 int ia[] = {1, 2, 3, 4, 5}; 33 int ir[] = {1, 3, 6, 10, 15}; 34 const unsigned s = sizeof(ia) / sizeof(ia[0]); 35 int ib[s] = {0}; 36 OutIter r = std::partial_sum(InIter(ia), InIter(ia+s), OutIter(ib)); 37 assert(base(r) == ib + s); 38 for (unsigned i = 0; i < s; ++i) 39 assert(ib[i] == ir[i]); 40 } 41 42 TEST_CONSTEXPR_CXX20 bool 43 test() 44 { 45 test<input_iterator<const int*>, output_iterator<int*> >(); 46 test<input_iterator<const int*>, forward_iterator<int*> >(); 47 test<input_iterator<const int*>, bidirectional_iterator<int*> >(); 48 test<input_iterator<const int*>, random_access_iterator<int*> >(); 49 test<input_iterator<const int*>, int*>(); 50 51 test<forward_iterator<const int*>, output_iterator<int*> >(); 52 test<forward_iterator<const int*>, forward_iterator<int*> >(); 53 test<forward_iterator<const int*>, bidirectional_iterator<int*> >(); 54 test<forward_iterator<const int*>, random_access_iterator<int*> >(); 55 test<forward_iterator<const int*>, int*>(); 56 57 test<bidirectional_iterator<const int*>, output_iterator<int*> >(); 58 test<bidirectional_iterator<const int*>, forward_iterator<int*> >(); 59 test<bidirectional_iterator<const int*>, bidirectional_iterator<int*> >(); 60 test<bidirectional_iterator<const int*>, random_access_iterator<int*> >(); 61 test<bidirectional_iterator<const int*>, int*>(); 62 63 test<random_access_iterator<const int*>, output_iterator<int*> >(); 64 test<random_access_iterator<const int*>, forward_iterator<int*> >(); 65 test<random_access_iterator<const int*>, bidirectional_iterator<int*> >(); 66 test<random_access_iterator<const int*>, random_access_iterator<int*> >(); 67 test<random_access_iterator<const int*>, int*>(); 68 69 test<const int*, output_iterator<int*> >(); 70 test<const int*, forward_iterator<int*> >(); 71 test<const int*, bidirectional_iterator<int*> >(); 72 test<const int*, random_access_iterator<int*> >(); 73 test<const int*, int*>(); 74 75 return true; 76 } 77 78 int main(int, char**) 79 { 80 test(); 81 #if TEST_STD_VER > 17 82 static_assert(test()); 83 #endif 84 return 0; 85 } 86