From bf6d4a5cbf131f79d9d808a4316ddbd4043a1a54 Mon Sep 17 00:00:00 2001 From: davidot Date: Mon, 10 Oct 2022 02:30:29 +0200 Subject: [PATCH] AK: Make truncating UFixedBigInts constexpr Also add some tests and shift tests while we're at it. --- AK/UFixedBigInt.h | 2 +- Tests/AK/TestUFixedBigInt.cpp | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/AK/UFixedBigInt.h b/AK/UFixedBigInt.h index 9880dc75d7..584d762cf9 100644 --- a/AK/UFixedBigInt.h +++ b/AK/UFixedBigInt.h @@ -87,7 +87,7 @@ public: } template - requires(sizeof(T) >= sizeof(U)) explicit operator U() const + requires(sizeof(T) >= sizeof(U)) constexpr explicit operator U() const { return static_cast(m_low); } diff --git a/Tests/AK/TestUFixedBigInt.cpp b/Tests/AK/TestUFixedBigInt.cpp index 258beb06bf..1c0799df70 100644 --- a/Tests/AK/TestUFixedBigInt.cpp +++ b/Tests/AK/TestUFixedBigInt.cpp @@ -88,6 +88,21 @@ TEST_CASE(div_mod) } } +TEST_CASE(shifts) +{ + u128 val { 0x1234ULL }; + EXPECT_EQ(val << 1u, u128(0x2468ull)); + EXPECT_EQ(val << 4u, u128(0x12340ull)); + EXPECT_EQ(val << 64u, u128(0ull, 0x1234ull)); +} + +TEST_CASE(constexpr_truncae) +{ + static constexpr u256 wide = u256(u128 { 0x8a4b08d32f8b8e48ULL, 0x8459322f67b8e26dULL }, u128 { 0xeea82af4312d1931ULL, 0x654fb5cfe82dbd58ULL }); + static constexpr u64 val = static_cast(wide); + EXPECT_EQ(val, 0x8a4b08d32f8b8e48ULL); +} + TEST_CASE(mod_hardcoded) { EXPECT_EQ(u256(u128 { 0x8a4b08d32f8b8e48ULL, 0x8459322f67b8e26dULL }, u128 { 0xeea82af4312d1931ULL, 0x654fb5cfe82dbd58ULL }) % u256(u128 { 0x40a58652868d5d66ULL, 0x81d674bf7d6d6861ULL }, u128 { 0xa8314900e6188a82ULL, 0xc273ca947237b4aaULL }), u256(u128 { 0x8a4b08d32f8b8e48ULL, 0x8459322f67b8e26dULL }, u128 { 0xeea82af4312d1931ULL, 0x654fb5cfe82dbd58ULL }));