summaryrefslogtreecommitdiffstats
path: root/libcxx/test/std/numerics/numeric.ops/numeric.ops.midpoint
diff options
context:
space:
mode:
authorMarshall Clow <mclow.lists@gmail.com>2019-03-14 16:25:55 +0000
committerMarshall Clow <mclow.lists@gmail.com>2019-03-14 16:25:55 +0000
commit330ab33f7c137ad3debd813ab7e7599e44e19346 (patch)
treeb396fc874dc80997e2533eecfcc5dfc11936ff2d /libcxx/test/std/numerics/numeric.ops/numeric.ops.midpoint
parent4962816e7242b9cec7a1a1157e4efaac75a6120a (diff)
downloadbcm5719-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')
-rw-r--r--libcxx/test/std/numerics/numeric.ops/numeric.ops.midpoint/midpoint.fail.cpp30
-rw-r--r--libcxx/test/std/numerics/numeric.ops/numeric.ops.midpoint/midpoint.integer.pass.cpp137
-rw-r--r--libcxx/test/std/numerics/numeric.ops/numeric.ops.midpoint/midpoint.pointer.pass.cpp57
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;
+}
OpenPOWER on IntegriCloud