From 8da0925d6d4696b050dc0862979beb391508f7ee Mon Sep 17 00:00:00 2001 From: Jelle Raaijmakers Date: Tue, 4 Jan 2022 15:01:25 +0100 Subject: [PATCH] AK: Add `mix` --- AK/StdLibExtras.h | 7 +++++++ Tests/AK/TestStdLibExtras.cpp | 14 ++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/AK/StdLibExtras.h b/AK/StdLibExtras.h index 844996cacf..2fcb8565b9 100644 --- a/AK/StdLibExtras.h +++ b/AK/StdLibExtras.h @@ -91,6 +91,12 @@ constexpr T clamp(const T& value, const IdentityType& min, const IdentityType return value; } +template +constexpr T mix(T const& v1, T const& v2, U const& interpolation) +{ + return v1 + (v2 - v1) * interpolation; +} + template constexpr T ceil_div(T a, U b) { @@ -167,6 +173,7 @@ using AK::exchange; using AK::is_constant_evaluated; using AK::max; using AK::min; +using AK::mix; using AK::RawPtr; using AK::swap; using AK::to_underlying; diff --git a/Tests/AK/TestStdLibExtras.cpp b/Tests/AK/TestStdLibExtras.cpp index 6a371cfcac..0dc5113160 100644 --- a/Tests/AK/TestStdLibExtras.cpp +++ b/Tests/AK/TestStdLibExtras.cpp @@ -12,6 +12,20 @@ #include #include +TEST_CASE(mix) +{ + double a = 1.0; + double b = 3.0; + + EXPECT_APPROXIMATE(mix(a, b, 0.0), 1.0); + EXPECT_APPROXIMATE(mix(a, b, 0.5), 2.0); + EXPECT_APPROXIMATE(mix(a, b, 1.0), 3.0); + + EXPECT_APPROXIMATE(mix(b, a, 0.0), 3.0); + EXPECT_APPROXIMATE(mix(b, a, 0.5), 2.0); + EXPECT_APPROXIMATE(mix(b, a, 1.0), 1.0); +} + TEST_CASE(swap) { int i = 4;