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 // UNSUPPORTED: c++98, c++03, c++11, c++14, c++17 10 // <numeric> 11 12 // template <class _Tp> 13 // _Tp midpoint(_Tp __a, _Tp __b) noexcept 14 // 15 16 #include <numeric> 17 #include <cassert> 18 #include "test_macros.h" 19 20 template <typename T> 21 void signed_test() 22 { 23 constexpr T zero{0}; 24 constexpr T one{1}; 25 constexpr T two{2}; 26 constexpr T three{3}; 27 constexpr T four{4}; 28 29 ASSERT_SAME_TYPE(decltype(std::midpoint(T(), T())), T); 30 ASSERT_NOEXCEPT( std::midpoint(T(), T())); 31 using limits = std::numeric_limits<T>; 32 33 static_assert(std::midpoint(one, three) == two, ""); 34 static_assert(std::midpoint(three, one) == two, ""); 35 36 assert(std::midpoint(zero, zero) == zero); 37 assert(std::midpoint(zero, two) == one); 38 assert(std::midpoint(two, zero) == one); 39 assert(std::midpoint(two, two) == two); 40 41 assert(std::midpoint(one, four) == two); 42 assert(std::midpoint(four, one) == three); 43 assert(std::midpoint(three, four) == three); 44 assert(std::midpoint(four, three) == four); 45 46 assert(std::midpoint(T( 3), T( 4)) == T(3)); 47 assert(std::midpoint(T( 4), T( 3)) == T(4)); 48 assert(std::midpoint(T(-3), T( 4)) == T(0)); 49 assert(std::midpoint(T(-4), T( 3)) == T(-1)); 50 assert(std::midpoint(T( 3), T(-4)) == T(0)); 51 assert(std::midpoint(T( 4), T(-3)) == T(1)); 52 assert(std::midpoint(T(-3), T(-4)) == T(-3)); 53 assert(std::midpoint(T(-4), T(-3)) == T(-4)); 54 55 static_assert(std::midpoint(limits::min(), limits::max()) == T(-1), ""); 56 static_assert(std::midpoint(limits::max(), limits::min()) == T( 0), ""); 57 58 static_assert(std::midpoint(limits::min(), T(6)) == limits::min()/2 + 3, ""); 59 assert( std::midpoint(T(6), limits::min()) == limits::min()/2 + 3); 60 assert( std::midpoint(limits::max(), T(6)) == limits::max()/2 + 4); 61 static_assert(std::midpoint(T(6), limits::max()) == limits::max()/2 + 3, ""); 62 63 assert( std::midpoint(limits::min(), T(-6)) == limits::min()/2 - 3); 64 static_assert(std::midpoint(T(-6), limits::min()) == limits::min()/2 - 3, ""); 65 static_assert(std::midpoint(limits::max(), T(-6)) == limits::max()/2 - 2, ""); 66 assert( std::midpoint(T(-6), limits::max()) == limits::max()/2 - 3); 67 } 68 69 template <typename T> 70 void unsigned_test() 71 { 72 constexpr T zero{0}; 73 constexpr T one{1}; 74 constexpr T two{2}; 75 constexpr T three{3}; 76 constexpr T four{4}; 77 78 ASSERT_SAME_TYPE(decltype(std::midpoint(T(), T())), T); 79 ASSERT_NOEXCEPT( std::midpoint(T(), T())); 80 using limits = std::numeric_limits<T>; 81 const T half_way = (limits::max() - limits::min())/2; 82 83 static_assert(std::midpoint(one, three) == two, ""); 84 static_assert(std::midpoint(three, one) == two, ""); 85 86 assert(std::midpoint(zero, zero) == zero); 87 assert(std::midpoint(zero, two) == one); 88 assert(std::midpoint(two, zero) == one); 89 assert(std::midpoint(two, two) == two); 90 91 assert(std::midpoint(one, four) == two); 92 assert(std::midpoint(four, one) == three); 93 assert(std::midpoint(three, four) == three); 94 assert(std::midpoint(four, three) == four); 95 96 assert(std::midpoint(limits::min(), limits::max()) == T(half_way)); 97 assert(std::midpoint(limits::max(), limits::min()) == T(half_way + 1)); 98 99 static_assert(std::midpoint(limits::min(), T(6)) == limits::min()/2 + 3, ""); 100 assert( std::midpoint(T(6), limits::min()) == limits::min()/2 + 3); 101 assert( std::midpoint(limits::max(), T(6)) == half_way + 4); 102 static_assert(std::midpoint(T(6), limits::max()) == half_way + 3, ""); 103 } 104 105 106 int main(int, char**) 107 { 108 signed_test<signed char>(); 109 signed_test<short>(); 110 signed_test<int>(); 111 signed_test<long>(); 112 signed_test<long long>(); 113 114 signed_test<int8_t>(); 115 signed_test<int16_t>(); 116 signed_test<int32_t>(); 117 signed_test<int64_t>(); 118 signed_test<__int128_t>(); 119 120 unsigned_test<unsigned char>(); 121 unsigned_test<unsigned short>(); 122 unsigned_test<unsigned int>(); 123 unsigned_test<unsigned long>(); 124 unsigned_test<unsigned long long>(); 125 126 unsigned_test<uint8_t>(); 127 unsigned_test<uint16_t>(); 128 unsigned_test<uint32_t>(); 129 unsigned_test<uint64_t>(); 130 unsigned_test<__uint128_t>(); 131 132 // int_test<char>(); 133 signed_test<ptrdiff_t>(); 134 unsigned_test<size_t>(); 135 136 return 0; 137 } 138