]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/testsuite/26_numerics/midpoint/integral.cc
libstdc++: Test for feature test macros more accurately
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / 26_numerics / midpoint / integral.cc
CommitLineData
83ffe9cd 1// Copyright (C) 2019-2023 Free Software Foundation, Inc.
24387442
JW
2//
3// This file is part of the GNU ISO C++ Library. This library is free
4// software; you can redistribute it and/or modify it under the
5// terms of the GNU General Public License as published by the
6// Free Software Foundation; either version 3, or (at your option)
7// any later version.
8
9// This library is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12// GNU General Public License for more details.
13
14// You should have received a copy of the GNU General Public License along
15// with this library; see the file COPYING3. If not see
16// <http://www.gnu.org/licenses/>.
17
bb2dd761 18// { dg-do run { target c++20 } }
f4ab6846 19// { dg-add-options no_pch }
24387442
JW
20
21#include <numeric>
22
23#ifndef __cpp_lib_interpolate
b1c0e859 24# error "Feature-test macro for midpoint and lerp missing in <numeric>"
24387442 25#elif __cpp_lib_interpolate != 201902L
b1c0e859 26# error "Feature-test macro for midpoint and lerp has wrong value in <numeric>"
24387442
JW
27#endif
28
29#include <climits>
30#include <testsuite_hooks.h>
31
32static_assert(std::is_same_v<decltype(std::midpoint(0, 1)), int>);
33static_assert(noexcept(std::midpoint(1, 2)));
34
35struct test_type { };
36template<typename T> decltype(std::midpoint<T>(T(), T())) try_midpoint(int);
37template<typename T> test_type try_midpoint(...);
38template<typename T> constexpr bool no_midpoint()
39{ return std::is_same_v<decltype(try_midpoint<T>()), test_type>; }
40
41static_assert(no_midpoint<bool>());
42static_assert(no_midpoint<const bool>());
43static_assert(no_midpoint<const int>());
44static_assert(no_midpoint<volatile int>());
45
46static_assert( std::midpoint(0, 0) == 0 );
47static_assert( std::midpoint(1, 1) == 1 );
48static_assert( std::midpoint(0, 1) == 0 );
49static_assert( std::midpoint(1, 0) == 1 );
50static_assert( std::midpoint(0, 2) == 1 );
51static_assert( std::midpoint(3, 2) == 3 );
52static_assert( std::midpoint(-5, 4) == -1 );
53static_assert( std::midpoint(5, -4) == 1 );
54static_assert( std::midpoint(-5, -4) == -5 );
55static_assert( std::midpoint(-4, -5) == -4 );
56static_assert( std::midpoint(INT_MIN, INT_MAX) == -1 );
57static_assert( std::midpoint(INT_MAX, INT_MIN) == 0 );
58static_assert( std::midpoint(INT_MAX, INT_MAX) == INT_MAX );
59static_assert( std::midpoint(INT_MAX, INT_MAX-1) == INT_MAX );
60static_assert( std::midpoint(INT_MAX-1, INT_MAX-1) == INT_MAX-1 );
61static_assert( std::midpoint(INT_MAX-1, INT_MAX) == INT_MAX-1 );
62static_assert( std::midpoint(INT_MAX, INT_MAX-2) == INT_MAX-1 );
63
64static_assert( std::midpoint(0u, 0u) == 0 );
65static_assert( std::midpoint(0u, 1u) == 0 );
66static_assert( std::midpoint(1u, 0u) == 1 );
67static_assert( std::midpoint(0u, 2u) == 1 );
68static_assert( std::midpoint(3u, 2u) == 3 );
69static_assert( std::midpoint(0u, UINT_MAX) == UINT_MAX/2 );
70static_assert( std::midpoint(UINT_MAX, 0u) == (UINT_MAX/2 + 1) );
71static_assert( std::midpoint(UINT_MAX, UINT_MAX) == UINT_MAX );
72static_assert( std::midpoint(UINT_MAX, UINT_MAX-1) == UINT_MAX );
73static_assert( std::midpoint(UINT_MAX-1, UINT_MAX-1) == UINT_MAX-1 );
74static_assert( std::midpoint(UINT_MAX-1, UINT_MAX) == UINT_MAX-1 );
75static_assert( std::midpoint(UINT_MAX, UINT_MAX-2) == UINT_MAX-1 );
76
77static_assert( std::midpoint<short>(0, 0) == 0 );
78static_assert( std::midpoint<short>(0, 1) == 0 );
79static_assert( std::midpoint<short>(1, 0) == 1 );
80static_assert( std::midpoint<short>(0, 2) == 1 );
81static_assert( std::midpoint<short>(3, 2) == 3 );
82static_assert( std::midpoint<short>(-5, 4) == -1 );
83static_assert( std::midpoint<short>(5, -4) == 1 );
84static_assert( std::midpoint<short>(-5, -4) == -5 );
85static_assert( std::midpoint<short>(-4, -5) == -4 );
86static_assert( std::midpoint<short>(SHRT_MIN, SHRT_MAX) == -1 );
87static_assert( std::midpoint<short>(SHRT_MAX, SHRT_MIN) == 0 );
88static_assert( std::midpoint<short>(SHRT_MAX, SHRT_MAX) == SHRT_MAX );
89static_assert( std::midpoint<short>(SHRT_MAX, SHRT_MAX-1) == SHRT_MAX );
90static_assert( std::midpoint<short>(SHRT_MAX-1, SHRT_MAX-1) == SHRT_MAX-1 );
91static_assert( std::midpoint<short>(SHRT_MAX-1, SHRT_MAX) == SHRT_MAX-1 );
92static_assert( std::midpoint<short>(SHRT_MAX, SHRT_MAX-2) == SHRT_MAX-1 );
93
94static_assert( std::midpoint<signed char>(0, 0) == 0 );
95static_assert( std::midpoint<signed char>(1, 1) == 1 );
96static_assert( std::midpoint<signed char>(0, 1) == 0 );
97static_assert( std::midpoint<signed char>(1, 0) == 1 );
98static_assert( std::midpoint<signed char>(0, 2) == 1 );
99static_assert( std::midpoint<signed char>(3, 2) == 3 );
100static_assert( std::midpoint<signed char>(-5, 4) == -1 );
101static_assert( std::midpoint<signed char>(5, -4) == 1 );
102static_assert( std::midpoint<signed char>(-5, -4) == -5 );
103static_assert( std::midpoint<signed char>(-4, -5) == -4 );
104static_assert( std::midpoint<signed char>(SCHAR_MIN, SCHAR_MAX) == -1 );
105static_assert( std::midpoint<signed char>(SCHAR_MAX, SCHAR_MIN) == 0 );
106static_assert( std::midpoint<signed char>(SCHAR_MAX, SCHAR_MAX) == SCHAR_MAX );
107static_assert( std::midpoint<signed char>(SCHAR_MAX, SCHAR_MAX-1) == SCHAR_MAX);
108
109void
110test01()
111{
112 // Test every possibility for signed char.
113 for (int a = SCHAR_MIN; a <= SCHAR_MAX; ++a)
114 for (int b = SCHAR_MIN; b <= SCHAR_MAX; ++b)
115 VERIFY( std::midpoint(a, b) == std::midpoint<int>(a, b) );
116}
117
118int main()
119{
120 test01();
121}