xref: /llvm-project/libcxx/test/std/numerics/numeric.ops/partial.sum/partial_sum.pass.cpp (revision 5e97d37b960840cabf32dfef3503b28ba5d21dc2)
15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier 
95a83710eSEric Fiselier // <numeric>
105a83710eSEric Fiselier 
1167c88e47SMark de Wever // Became constexpr in C++20
125a83710eSEric Fiselier // template <InputIterator InIter, OutputIterator<auto, const InIter::value_type&> OutIter>
135a83710eSEric Fiselier //   requires HasPlus<InIter::value_type, InIter::reference>
145a83710eSEric Fiselier //         && HasAssign<InIter::value_type,
155a83710eSEric Fiselier //                      HasPlus<InIter::value_type, InIter::reference>::result_type>
165a83710eSEric Fiselier //         && Constructible<InIter::value_type, InIter::reference>
175a83710eSEric Fiselier //   OutIter
185a83710eSEric Fiselier //   partial_sum(InIter first, InIter last, OutIter result);
195a83710eSEric Fiselier 
205a83710eSEric Fiselier #include <numeric>
215a83710eSEric Fiselier #include <cassert>
225a83710eSEric Fiselier 
237fc6a556SMarshall Clow #include "test_macros.h"
245a83710eSEric Fiselier #include "test_iterators.h"
255a83710eSEric Fiselier 
265a83710eSEric Fiselier template <class InIter, class OutIter>
2767c88e47SMark de Wever TEST_CONSTEXPR_CXX20 void
test()285a83710eSEric Fiselier test()
295a83710eSEric Fiselier {
305a83710eSEric Fiselier     int ia[] = {1, 2, 3, 4, 5};
315a83710eSEric Fiselier     int ir[] = {1, 3, 6, 10, 15};
325a83710eSEric Fiselier     const unsigned s = sizeof(ia) / sizeof(ia[0]);
335a83710eSEric Fiselier     int ib[s] = {0};
345a83710eSEric Fiselier     OutIter r = std::partial_sum(InIter(ia), InIter(ia+s), OutIter(ib));
355a83710eSEric Fiselier     assert(base(r) == ib + s);
365a83710eSEric Fiselier     for (unsigned i = 0; i < s; ++i)
375a83710eSEric Fiselier         assert(ib[i] == ir[i]);
385a83710eSEric Fiselier }
395a83710eSEric Fiselier 
4067c88e47SMark de Wever TEST_CONSTEXPR_CXX20 bool
test()4167c88e47SMark de Wever test()
425a83710eSEric Fiselier {
43*5e97d37bSMark de Wever     test<cpp17_input_iterator<const int*>, cpp17_output_iterator<int*> >();
44773ae441SChristopher Di Bella     test<cpp17_input_iterator<const int*>, forward_iterator<int*> >();
45773ae441SChristopher Di Bella     test<cpp17_input_iterator<const int*>, bidirectional_iterator<int*> >();
46773ae441SChristopher Di Bella     test<cpp17_input_iterator<const int*>, random_access_iterator<int*> >();
47773ae441SChristopher Di Bella     test<cpp17_input_iterator<const int*>, int*>();
485a83710eSEric Fiselier 
49*5e97d37bSMark de Wever     test<forward_iterator<const int*>, cpp17_output_iterator<int*> >();
505a83710eSEric Fiselier     test<forward_iterator<const int*>, forward_iterator<int*> >();
515a83710eSEric Fiselier     test<forward_iterator<const int*>, bidirectional_iterator<int*> >();
525a83710eSEric Fiselier     test<forward_iterator<const int*>, random_access_iterator<int*> >();
535a83710eSEric Fiselier     test<forward_iterator<const int*>, int*>();
545a83710eSEric Fiselier 
55*5e97d37bSMark de Wever     test<bidirectional_iterator<const int*>, cpp17_output_iterator<int*> >();
565a83710eSEric Fiselier     test<bidirectional_iterator<const int*>, forward_iterator<int*> >();
575a83710eSEric Fiselier     test<bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
585a83710eSEric Fiselier     test<bidirectional_iterator<const int*>, random_access_iterator<int*> >();
595a83710eSEric Fiselier     test<bidirectional_iterator<const int*>, int*>();
605a83710eSEric Fiselier 
61*5e97d37bSMark de Wever     test<random_access_iterator<const int*>, cpp17_output_iterator<int*> >();
625a83710eSEric Fiselier     test<random_access_iterator<const int*>, forward_iterator<int*> >();
635a83710eSEric Fiselier     test<random_access_iterator<const int*>, bidirectional_iterator<int*> >();
645a83710eSEric Fiselier     test<random_access_iterator<const int*>, random_access_iterator<int*> >();
655a83710eSEric Fiselier     test<random_access_iterator<const int*>, int*>();
665a83710eSEric Fiselier 
67*5e97d37bSMark de Wever     test<const int*, cpp17_output_iterator<int*> >();
685a83710eSEric Fiselier     test<const int*, forward_iterator<int*> >();
695a83710eSEric Fiselier     test<const int*, bidirectional_iterator<int*> >();
705a83710eSEric Fiselier     test<const int*, random_access_iterator<int*> >();
715a83710eSEric Fiselier     test<const int*, int*>();
722df59c50SJF Bastien 
7367c88e47SMark de Wever     return true;
7467c88e47SMark de Wever }
7567c88e47SMark de Wever 
main(int,char **)7667c88e47SMark de Wever int main(int, char**)
7767c88e47SMark de Wever {
7867c88e47SMark de Wever     test();
7967c88e47SMark de Wever #if TEST_STD_VER > 17
8067c88e47SMark de Wever     static_assert(test());
8167c88e47SMark de Wever #endif
822df59c50SJF Bastien     return 0;
835a83710eSEric Fiselier }
84