diff options
author | Marshall Clow <mclow.lists@gmail.com> | 2019-03-14 16:25:55 +0000 |
---|---|---|
committer | Marshall Clow <mclow.lists@gmail.com> | 2019-03-14 16:25:55 +0000 |
commit | 330ab33f7c137ad3debd813ab7e7599e44e19346 (patch) | |
tree | b396fc874dc80997e2533eecfcc5dfc11936ff2d /libcxx/test/std/numerics/numeric.ops/numeric.ops.midpoint | |
parent | 4962816e7242b9cec7a1a1157e4efaac75a6120a (diff) | |
download | bcm5719-llvm-330ab33f7c137ad3debd813ab7e7599e44e19346.tar.gz bcm5719-llvm-330ab33f7c137ad3debd813ab7e7599e44e19346.zip |
Add std::midpoint for integral and poiner types. Described in P0811, reviewed as D59099.
llvm-svn: 356162
Diffstat (limited to 'libcxx/test/std/numerics/numeric.ops/numeric.ops.midpoint')
3 files changed, 224 insertions, 0 deletions
diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.midpoint/midpoint.fail.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.midpoint/midpoint.fail.cpp new file mode 100644 index 00000000000..2352ce788be --- /dev/null +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.midpoint/midpoint.fail.cpp @@ -0,0 +1,30 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17 +// <numeric> + +// template <class _Tp> +// _Tp midpoint(_Tp __a, _Tp __b) noexcept + +// An overload exists for each of char and all arithmetic types except bool. + +#include <numeric> + +#include "test_macros.h" + +int main(int, char**) +{ + (void) std::midpoint(false, true); // expected-error {{no matching function for call to 'midpoint'}} + +// A couple of odd pointer types that should fail + (void) std::midpoint(nullptr, nullptr); // expected-error {{no matching function for call to 'midpoint'}} + (void) std::midpoint((void *)0, (void *)0); // expected-error@numeric:* {{arithmetic on pointers to void}} + + return 0; +} diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.midpoint/midpoint.integer.pass.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.midpoint/midpoint.integer.pass.cpp new file mode 100644 index 00000000000..6b0f095a07a --- /dev/null +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.midpoint/midpoint.integer.pass.cpp @@ -0,0 +1,137 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17 +// <numeric> + +// template <class _Tp> +// _Tp midpoint(_Tp __a, _Tp __b) noexcept +// + +#include <numeric> +#include <cassert> +#include "test_macros.h" + +template <typename T> +void signed_test() +{ + constexpr T zero{0}; + constexpr T one{1}; + constexpr T two{2}; + constexpr T three{3}; + constexpr T four{4}; + + ASSERT_SAME_TYPE(decltype(std::midpoint(T(), T())), T); + ASSERT_NOEXCEPT( std::midpoint(T(), T())); + using limits = std::numeric_limits<T>; + + static_assert(std::midpoint(one, three) == two, ""); + static_assert(std::midpoint(three, one) == two, ""); + + assert(std::midpoint(zero, zero) == zero); + assert(std::midpoint(zero, two) == one); + assert(std::midpoint(two, zero) == one); + assert(std::midpoint(two, two) == two); + + assert(std::midpoint(one, four) == two); + assert(std::midpoint(four, one) == three); + assert(std::midpoint(three, four) == three); + assert(std::midpoint(four, three) == four); + + assert(std::midpoint(T( 3), T( 4)) == T(3)); + assert(std::midpoint(T( 4), T( 3)) == T(4)); + assert(std::midpoint(T(-3), T( 4)) == T(0)); + assert(std::midpoint(T(-4), T( 3)) == T(-1)); + assert(std::midpoint(T( 3), T(-4)) == T(0)); + assert(std::midpoint(T( 4), T(-3)) == T(1)); + assert(std::midpoint(T(-3), T(-4)) == T(-3)); + assert(std::midpoint(T(-4), T(-3)) == T(-4)); + + static_assert(std::midpoint(limits::min(), limits::max()) == T(-1), ""); + static_assert(std::midpoint(limits::max(), limits::min()) == T( 0), ""); + + static_assert(std::midpoint(limits::min(), T(6)) == limits::min()/2 + 3, ""); + assert( std::midpoint(T(6), limits::min()) == limits::min()/2 + 3); + assert( std::midpoint(limits::max(), T(6)) == limits::max()/2 + 4); + static_assert(std::midpoint(T(6), limits::max()) == limits::max()/2 + 3, ""); + + assert( std::midpoint(limits::min(), T(-6)) == limits::min()/2 - 3); + static_assert(std::midpoint(T(-6), limits::min()) == limits::min()/2 - 3, ""); + static_assert(std::midpoint(limits::max(), T(-6)) == limits::max()/2 - 2, ""); + assert( std::midpoint(T(-6), limits::max()) == limits::max()/2 - 3); +} + +template <typename T> +void unsigned_test() +{ + constexpr T zero{0}; + constexpr T one{1}; + constexpr T two{2}; + constexpr T three{3}; + constexpr T four{4}; + + ASSERT_SAME_TYPE(decltype(std::midpoint(T(), T())), T); + ASSERT_NOEXCEPT( std::midpoint(T(), T())); + using limits = std::numeric_limits<T>; + const T half_way = (limits::max() - limits::min())/2; + + static_assert(std::midpoint(one, three) == two, ""); + static_assert(std::midpoint(three, one) == two, ""); + + assert(std::midpoint(zero, zero) == zero); + assert(std::midpoint(zero, two) == one); + assert(std::midpoint(two, zero) == one); + assert(std::midpoint(two, two) == two); + + assert(std::midpoint(one, four) == two); + assert(std::midpoint(four, one) == three); + assert(std::midpoint(three, four) == three); + assert(std::midpoint(four, three) == four); + + assert(std::midpoint(limits::min(), limits::max()) == T(half_way)); + assert(std::midpoint(limits::max(), limits::min()) == T(half_way + 1)); + + static_assert(std::midpoint(limits::min(), T(6)) == limits::min()/2 + 3, ""); + assert( std::midpoint(T(6), limits::min()) == limits::min()/2 + 3); + assert( std::midpoint(limits::max(), T(6)) == half_way + 4); + static_assert(std::midpoint(T(6), limits::max()) == half_way + 3, ""); +} + + +int main(int, char**) +{ + signed_test<signed char>(); + signed_test<short>(); + signed_test<int>(); + signed_test<long>(); + signed_test<long long>(); + + signed_test<int8_t>(); + signed_test<int16_t>(); + signed_test<int32_t>(); + signed_test<int64_t>(); + signed_test<__int128_t>(); + + unsigned_test<unsigned char>(); + unsigned_test<unsigned short>(); + unsigned_test<unsigned int>(); + unsigned_test<unsigned long>(); + unsigned_test<unsigned long long>(); + + unsigned_test<uint8_t>(); + unsigned_test<uint16_t>(); + unsigned_test<uint32_t>(); + unsigned_test<uint64_t>(); + unsigned_test<__uint128_t>(); + +// int_test<char>(); + signed_test<ptrdiff_t>(); + unsigned_test<size_t>(); + + return 0; +} diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.midpoint/midpoint.pointer.pass.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.midpoint/midpoint.pointer.pass.cpp new file mode 100644 index 00000000000..48705d16fff --- /dev/null +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.midpoint/midpoint.pointer.pass.cpp @@ -0,0 +1,57 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17 +// <numeric> + +// template <class _Tp> +// _Tp* midpoint(_Tp* __a, _Tp* __b) noexcept +// + +#include <numeric> +#include <cassert> + +#include "test_macros.h" + + + +template <typename T> +void pointer_test() +{ + T array[1000] = {}; // we need an array to make valid pointers + constexpr T cArray[2] = {}; + ASSERT_SAME_TYPE(decltype(std::midpoint(array, array)), T*); + ASSERT_NOEXCEPT( std::midpoint(array, array)); + + static_assert(std::midpoint(cArray, cArray + 2) == cArray + 1, ""); + static_assert(std::midpoint(cArray + 2, cArray) == cArray + 1, ""); + + assert(std::midpoint(array, array) == array); + assert(std::midpoint(array, array + 1000) == array + 500); + + assert(std::midpoint(array, array + 9) == array + 4); + assert(std::midpoint(array, array + 10) == array + 5); + assert(std::midpoint(array, array + 11) == array + 5); + assert(std::midpoint(array + 9, array) == array + 5); + assert(std::midpoint(array + 10, array) == array + 5); + assert(std::midpoint(array + 11, array) == array + 6); +} + + +int main(int, char**) +{ + pointer_test< char>(); + pointer_test<const char>(); + pointer_test< volatile char>(); + pointer_test<const volatile char>(); + + pointer_test<int>(); + pointer_test<double>(); + + return 0; +} |