From 5dbea4283f684b59ae46de2aa178ced3ba40de49 Mon Sep 17 00:00:00 2001 From: Lucas CHOLLET Date: Mon, 13 Oct 2025 11:47:58 +0200 Subject: [PATCH] AK: Add the wrap_to_range() function --- AK/Math.h | 7 +++++++ Tests/AK/TestAKMath.cpp | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/AK/Math.h b/AK/Math.h index 0ffde11794b..4e9053e2549 100644 --- a/AK/Math.h +++ b/AK/Math.h @@ -1284,6 +1284,13 @@ constexpr I clamp_to(T value) return value; } +// Wrap a to keep it in the range [-b, b]. +template +constexpr T wrap_to_range(T a, IdentityType b) +{ + return fmod(fmod(a + b, 2 * b) + 2 * b, 2 * b) - b; +} + #undef CONSTEXPR_STATE #undef AARCH64_INSTRUCTION } diff --git a/Tests/AK/TestAKMath.cpp b/Tests/AK/TestAKMath.cpp index d66a4de1000..d7d96508c15 100644 --- a/Tests/AK/TestAKMath.cpp +++ b/Tests/AK/TestAKMath.cpp @@ -36,3 +36,12 @@ TEST_CASE(pow) EXPECT_EQ(AK::pow(1., -9223372036854775808.0), 1.); EXPECT_EQ(AK::pow(1., -9223372036854777856.0), 1.); } + +TEST_CASE(wrap_to_range) +{ + EXPECT_EQ(AK::wrap_to_range(-185., 180.), 175.); + EXPECT_EQ(AK::wrap_to_range(185., 180.), -175.); + EXPECT_EQ(AK::wrap_to_range(85., 180.), 85.); + EXPECT_EQ(AK::wrap_to_range(0., 180.), 0.); + EXPECT_EQ(AK::wrap_to_range(-85., 180.), -85.); +}