]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/testsuite/26_numerics/transform_reduce/1.cc
Update copyright years.
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / 26_numerics / transform_reduce / 1.cc
CommitLineData
ed920373
JW
1// { dg-do run { target c++17 } }
2
a945c346 3// Copyright (C) 2019-2024 Free Software Foundation, Inc.
ed920373
JW
4//
5// This file is part of the GNU ISO C++ Library. This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 3, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14// GNU General Public License for more details.
15
16// You should have received a copy of the GNU General Public License along
17// with this library; see the file COPYING3. If not see
18// <http://www.gnu.org/licenses/>.
19
20// C++17 29.8.5 [transform.reduce]
21
22#include <numeric>
23#include <iterator>
24#include <testsuite_hooks.h>
25#include <testsuite_iterators.h>
26
27int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
28double b[] = {0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5};
29
30using __gnu_test::test_container;
31using __gnu_test::input_iterator_wrapper;
32
33/*
34template<class InputIterator1, class InputIterator2, class T>
35 T transform_reduce(InputIterator1, InputIterator1, InputIterator2, T);
36*/
37void
38test01()
39{
40 auto res = std::transform_reduce(std::begin(a), std::end(a), std::begin(b),
41 1.0f);
42 static_assert(std::is_same_v<decltype(res), float>);
43 VERIFY( res == (float)(1 + 0.5 + 1 + 1.5 + 2 + 2.5 + 3 + 3.5 + 4 + 4.5 + 5) );
44
45 test_container<int, input_iterator_wrapper> ca(a);
46 test_container<double, input_iterator_wrapper> cb(b);
47
48 auto res2 = std::transform_reduce(ca.begin(), ca.end(), cb.begin(),
49 1.0f);
50 static_assert(std::is_same_v<decltype(res2), float>);
51 VERIFY( res2 == res );
52}
53
54/*
55template<class InputIterator1, class InputIterator2, class T,
56 class BinaryOperation1, class BinaryOperation2>
57 T transform_reduce(InputIterator1, InputIterator1, InputIterator2, T,
58 BinaryOperation1, BinaryOperation2);
59*/
60void
61test02()
62{
63 auto res = std::transform_reduce(std::begin(a), std::end(a), std::begin(b),
64 1L, std::multiplies<>(), std::plus<int>());
65 static_assert(std::is_same_v<decltype(res), long>);
66 VERIFY( res == (1L * 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10) );
67
68 test_container<int, input_iterator_wrapper> ca(a);
69 test_container<double, input_iterator_wrapper> cb(b);
70
71 auto res2 = std::transform_reduce(ca.begin(), ca.end(), cb.begin(),
72 1L, std::multiplies<>(), std::plus<int>());
73 static_assert(std::is_same_v<decltype(res2), long>);
74 VERIFY( res2 == res );
75}
76
77/*
78template<class InputIterator, class T, class BinaryOperation,
79 class UnaryOperation>
80 T transform_reduce(InputIterator, InputIterator, T,
81 BinaryOperation, UnaryOperation);
82*/
83void
84test03()
85{
86 auto res = std::transform_reduce(std::begin(a), std::end(a), 10.0,
87 std::plus<>(),
88 [](int i) { return i * i; });
89 static_assert(std::is_same_v<decltype(res), double>);
90 VERIFY( res == (10.0 + 1 + 4 + 9 + 16 + 25 + 36 + 49 + 64 + 81 + 100) );
91
92 test_container<int, input_iterator_wrapper> ca(a);
93 test_container<double, input_iterator_wrapper> cb(b);
94
95 auto res2 = std::transform_reduce(ca.begin(), ca.end(), 10.0,
96 std::plus<>(),
97 [](int i) { return i * i; });
98 static_assert(std::is_same_v<decltype(res2), double>);
99 VERIFY( res2 == (10.0 + 1 + 4 + 9 + 16 + 25 + 36 + 49 + 64 + 81 + 100) );
100}
101
102int
103main()
104{
105 test01();
106 test02();
107 test03();
108}