diff options
| author | Marshall Clow <mclow.lists@gmail.com> | 2019-04-25 17:44:18 +0000 |
|---|---|---|
| committer | Marshall Clow <mclow.lists@gmail.com> | 2019-04-25 17:44:18 +0000 |
| commit | b0e2daf64b8167dc7729cc7486f0c94c8902e9c6 (patch) | |
| tree | 043d6af6ea6a6b565096764db4d863a94f2a5c96 /libcxx/test/std | |
| parent | 19376ebd1aa07ca9099e3083d0fba5d258df45dd (diff) | |
| download | bcm5719-llvm-b0e2daf64b8167dc7729cc7486f0c94c8902e9c6.tar.gz bcm5719-llvm-b0e2daf64b8167dc7729cc7486f0c94c8902e9c6.zip | |
Implement 'lerp'; which is the last bit of P0811. Mark that paper as complete.
llvm-svn: 359211
Diffstat (limited to 'libcxx/test/std')
| -rw-r--r-- | libcxx/test/std/numerics/c.math/c.math.lerp/c.math.lerp.pass.cpp | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/libcxx/test/std/numerics/c.math/c.math.lerp/c.math.lerp.pass.cpp b/libcxx/test/std/numerics/c.math/c.math.lerp/c.math.lerp.pass.cpp new file mode 100644 index 00000000000..2ab41c18225 --- /dev/null +++ b/libcxx/test/std/numerics/c.math/c.math.lerp/c.math.lerp.pass.cpp @@ -0,0 +1,75 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// <cmath> + +// constexpr float lerp(float a, float b, float t); +// constexpr double lerp(double a, double b, double t); +// constexpr long double lerp(long double a, long double b, long double t); + + +#include <cmath> +#include <limits> +#include <type_traits> +#include <cassert> + +#include "test_macros.h" +#include "fp_compare.h" + +template <typename T> +constexpr bool constexpr_test() +{ + return std::lerp(T( 0), T(12), T(0)) == T(0) + && std::lerp(T(12), T( 0), T(0.5)) == T(6) + && std::lerp(T( 0), T(12), T(2)) == T(24); +} + + +template <typename T> +void test() +{ + ASSERT_SAME_TYPE(T, decltype(std::lerp(T(), T(), T()))); + LIBCPP_ASSERT_NOEXCEPT( std::lerp(T(), T(), T())); + +// constexpr T minV = std::numeric_limits<T>::min(); + constexpr T maxV = std::numeric_limits<T>::max(); + constexpr T inf = std::numeric_limits<T>::infinity(); + +// Things that can be compared exactly + assert((std::lerp(T( 0), T(12), T(0)) == T(0))); + assert((std::lerp(T( 0), T(12), T(1)) == T(12))); + assert((std::lerp(T(12), T( 0), T(0)) == T(12))); + assert((std::lerp(T(12), T( 0), T(1)) == T(0))); + + assert((std::lerp(T( 0), T(12), T(0.5)) == T(6))); + assert((std::lerp(T(12), T( 0), T(0.5)) == T(6))); + assert((std::lerp(T( 0), T(12), T(2)) == T(24))); + assert((std::lerp(T(12), T( 0), T(2)) == T(-12))); + + assert((std::lerp(maxV, maxV/10, T(0)) == maxV)); + assert((std::lerp(maxV/10, maxV, T(1)) == maxV)); + + assert((std::lerp(T(2.3), T(2.3), inf) == T(2.3))); + + assert(std::lerp(T( 0), T( 0), T(23)) == T(0)); + assert(std::isnan(std::lerp(T( 0), T( 0), inf))); +} + + +int main(int, char**) +{ + static_assert(constexpr_test<float>(), ""); + static_assert(constexpr_test<double>(), ""); + static_assert(constexpr_test<long double>(), ""); + + test<float>(); + test<double>(); + test<long double>(); + + return 0; +} |

