Add std::midpoint for integral and poiner types. Described in P0811, reviewed as D59099.

llvm-svn: 356162
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 0000000..48705d1
--- /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;
+}