/*
* Copyright ( C ) 2015 The Android Open Source Project
*
* Licensed under the Apache License , Version 2 . 0 ( the " License " ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an " AS IS " BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
*/
#include <vector>
#include "bit_utils.h"
#include "bit_utils_iterator.h"
#include "gtest/gtest.h"
namespace art {
// NOTE: CLZ(0u) is undefined.
static_assert(31 == CLZ<uint32_t>(1 u), "TestCLZ32#1" );
static_assert(30 == CLZ<uint32_t>(2 u), "TestCLZ32#2" );
static_assert(16 == CLZ<uint32_t>(0 x00008765u), "TestCLZ32#3" );
static_assert(15 == CLZ<uint32_t>(0 x00012345u), "TestCLZ32#4" );
static_assert(1 == CLZ<uint32_t>(0 x43214321u), "TestCLZ32#5" );
static_assert(0 == CLZ<uint32_t>(0 x87654321u), "TestCLZ32#6" );
// NOTE: CLZ(0ull) is undefined.
static_assert(63 == CLZ<uint64_t>(UINT64_C(1 )), "TestCLZ64#1" );
static_assert(62 == CLZ<uint64_t>(UINT64_C(3 )), "TestCLZ64#2" );
static_assert(48 == CLZ<uint64_t>(UINT64_C(0 x00008765)), "TestCLZ64#3" );
static_assert(32 == CLZ<uint64_t>(UINT64_C(0 x87654321)), "TestCLZ64#4" );
static_assert(31 == CLZ<uint64_t>(UINT64_C(0 x123456789)), "TestCLZ64#5" );
static_assert(16 == CLZ<uint64_t>(UINT64_C(0 x876543211234)), "TestCLZ64#6" );
static_assert(1 == CLZ<uint64_t>(UINT64_C(0 x4321432187654321)), "TestCLZ64#7" );
static_assert(0 == CLZ<uint64_t>(UINT64_C(0 x8765432187654321)), "TestCLZ64#8" );
// NOTE: CTZ(0u) is undefined.
static_assert(0 == CTZ<uint32_t>(1 u), "TestCTZ32#1" );
static_assert(1 == CTZ<uint32_t>(2 u), "TestCTZ32#2" );
static_assert(15 == CTZ<uint32_t>(0 x45678000u), "TestCTZ32#3" );
static_assert(16 == CTZ<uint32_t>(0 x43210000u), "TestCTZ32#4" );
static_assert(30 == CTZ<uint32_t>(0 xc0000000u), "TestCTZ32#5" );
static_assert(31 == CTZ<uint32_t>(0 x80000000u), "TestCTZ32#6" );
// NOTE: CTZ(0ull) is undefined.
static_assert(0 == CTZ<uint64_t>(UINT64_C(1 )), "TestCTZ64#1" );
static_assert(1 == CTZ<uint64_t>(UINT64_C(2 )), "TestCTZ64#2" );
static_assert(16 == CTZ<uint64_t>(UINT64_C(0 x43210000)), "TestCTZ64#3" );
static_assert(31 == CTZ<uint64_t>(UINT64_C(0 x80000000)), "TestCTZ64#4" );
static_assert(32 == CTZ<uint64_t>(UINT64_C(0 x8765432100000000)), "TestCTZ64#5" );
static_assert(48 == CTZ<uint64_t>(UINT64_C(0 x4321000000000000)), "TestCTZ64#6" );
static_assert(62 == CTZ<uint64_t>(UINT64_C(0 x4000000000000000)), "TestCTZ64#7" );
static_assert(63 == CTZ<uint64_t>(UINT64_C(0 x8000000000000000)), "TestCTZ64#8" );
static_assert(0 == POPCOUNT<uint32_t>(0 u), "TestPOPCOUNT32#1" );
static_assert(1 == POPCOUNT<uint32_t>(8 u), "TestPOPCOUNT32#2" );
static_assert(15 == POPCOUNT<uint32_t>(0 x55555554u), "TestPOPCOUNT32#3" );
static_assert(16 == POPCOUNT<uint32_t>(0 xaaaaaaaau), "TestPOPCOUNT32#4" );
static_assert(31 == POPCOUNT<uint32_t>(0 xfffffffeu), "TestPOPCOUNT32#5" );
static_assert(32 == POPCOUNT<uint32_t>(0 xffffffffu), "TestPOPCOUNT32#6" );
static_assert(0 == POPCOUNT<uint64_t>(UINT64_C(0 )), "TestPOPCOUNT64#1" );
static_assert(1 == POPCOUNT<uint64_t>(UINT64_C(0 x40000)), "TestPOPCOUNT64#2" );
static_assert(16 == POPCOUNT<uint64_t>(UINT64_C(0 x1414141482828282)), "TestPOPCOUNT64#3" );
static_assert(31 == POPCOUNT<uint64_t>(UINT64_C(0 x0000ffff00007fff)), "TestPOPCOUNT64#4" );
static_assert(32 == POPCOUNT<uint64_t>(UINT64_C(0 x5555555555555555)), "TestPOPCOUNT64#5" );
static_assert(48 == POPCOUNT<uint64_t>(UINT64_C(0 x7777bbbbddddeeee)), "TestPOPCOUNT64#6" );
static_assert(63 == POPCOUNT<uint64_t>(UINT64_C(0 x7fffffffffffffff)), "TestPOPCOUNT64#7" );
static_assert(64 == POPCOUNT<uint64_t>(UINT64_C(0 xffffffffffffffff)), "TestPOPCOUNT64#8" );
static_assert(-1 == MostSignificantBit<uint32_t>(0 u), "TestMSB32#1" );
static_assert(0 == MostSignificantBit<uint32_t>(1 u), "TestMSB32#2" );
static_assert(31 == MostSignificantBit<uint32_t>(~static_cast <uint32_t>(0 u)), "TestMSB32#3" );
static_assert(2 == MostSignificantBit<uint32_t>(0 b110), "TestMSB32#4" );
static_assert(2 == MostSignificantBit<uint32_t>(0 b100), "TestMSB32#5" );
static_assert(-1 == MostSignificantBit<uint64_t>(UINT64_C(0 )), "TestMSB64#1" );
static_assert(0 == MostSignificantBit<uint64_t>(UINT64_C(1 )), "TestMSB64#2" );
static_assert(63 == MostSignificantBit<uint64_t>(~UINT64_C(0 )), "TestMSB64#3" );
static_assert(34 == MostSignificantBit<uint64_t>(UINT64_C(0 x700000000)), "TestMSB64#4" );
static_assert(34 == MostSignificantBit<uint64_t>(UINT64_C(0 x777777777)), "TestMSB64#5" );
static_assert(-1 == LeastSignificantBit<uint32_t>(0 u), "TestLSB32#1" );
static_assert(0 == LeastSignificantBit<uint32_t>(1 u), "TestLSB32#1" );
static_assert(0 == LeastSignificantBit<uint32_t>(~static_cast <uint32_t>(0 u)), "TestLSB32#1" );
static_assert(1 == LeastSignificantBit<uint32_t>(0 b110), "TestLSB32#1" );
static_assert(2 == LeastSignificantBit<uint32_t>(0 b100), "TestLSB32#1" );
static_assert(-1 == LeastSignificantBit<uint64_t>(UINT64_C(0 )), "TestLSB64#1" );
static_assert(0 == LeastSignificantBit<uint64_t>(UINT64_C(1 )), "TestLSB64#2" );
static_assert(0 == LeastSignificantBit<uint64_t>(~UINT64_C(0 )), "TestLSB64#3" );
static_assert(12 == LeastSignificantBit<uint64_t>(UINT64_C(0 x5000)), "TestLSB64#4" );
static_assert(48 == LeastSignificantBit<uint64_t>(UINT64_C(0 x5555000000000000)), "TestLSB64#5" );
static_assert(0 u == MinimumBitsToStore<uint32_t>(0 u), "TestMinBits2Store32#1" );
static_assert(1 u == MinimumBitsToStore<uint32_t>(1 u), "TestMinBits2Store32#2" );
static_assert(2 u == MinimumBitsToStore<uint32_t>(0 b10u), "TestMinBits2Store32#3" );
static_assert(2 u == MinimumBitsToStore<uint32_t>(0 b11u), "TestMinBits2Store32#4" );
static_assert(3 u == MinimumBitsToStore<uint32_t>(0 b100u), "TestMinBits2Store32#5" );
static_assert(3 u == MinimumBitsToStore<uint32_t>(0 b110u), "TestMinBits2Store32#6" );
static_assert(3 u == MinimumBitsToStore<uint32_t>(0 b101u), "TestMinBits2Store32#7" );
static_assert(8 u == MinimumBitsToStore<uint32_t>(0 xFFu), "TestMinBits2Store32#8" );
static_assert(32 u == MinimumBitsToStore<uint32_t>(~static_cast <uint32_t>(0 u)),
"TestMinBits2Store32#9" );
static_assert(0 u == MinimumBitsToStore<uint64_t>(UINT64_C(0 )), "TestMinBits2Store64#1" );
static_assert(1 u == MinimumBitsToStore<uint64_t>(UINT64_C(1 )), "TestMinBits2Store64#2" );
static_assert(2 u == MinimumBitsToStore<uint64_t>(UINT64_C(0 b10)), "TestMinBits2Store64#3" );
static_assert(2 u == MinimumBitsToStore<uint64_t>(UINT64_C(0 b11)), "TestMinBits2Store64#4" );
static_assert(3 u == MinimumBitsToStore<uint64_t>(UINT64_C(0 b100)), "TestMinBits2Store64#5" );
static_assert(3 u == MinimumBitsToStore<uint64_t>(UINT64_C(0 b110)), "TestMinBits2Store64#6" );
static_assert(3 u == MinimumBitsToStore<uint64_t>(UINT64_C(0 b101)), "TestMinBits2Store64#7" );
static_assert(8 u == MinimumBitsToStore<uint64_t>(UINT64_C(0 xFF)), "TestMinBits2Store64#8" );
static_assert(32 u == MinimumBitsToStore<uint64_t>(UINT64_C(0 xFFFFFFFF)), "TestMinBits2Store64#9" );
static_assert(33 u == MinimumBitsToStore<uint64_t>(UINT64_C(0 x1FFFFFFFF)), "TestMinBits2Store64#10" );
static_assert(64 u == MinimumBitsToStore<uint64_t>(~UINT64_C(0 )), "TestMinBits2Store64#11" );
static_assert(0 == TruncToPowerOfTwo<uint32_t>(0 u), "TestTruncToPowerOfTwo32#1" );
static_assert(1 == TruncToPowerOfTwo<uint32_t>(1 u), "TestTruncToPowerOfTwo32#2" );
static_assert(2 == TruncToPowerOfTwo<uint32_t>(2 u), "TestTruncToPowerOfTwo32#3" );
static_assert(2 == TruncToPowerOfTwo<uint32_t>(3 u), "TestTruncToPowerOfTwo32#4" );
static_assert(4 == TruncToPowerOfTwo<uint32_t>(7 u), "TestTruncToPowerOfTwo32#5" );
static_assert(0 x20000u == TruncToPowerOfTwo<uint32_t>(0 x3aaaau),
"TestTruncToPowerOfTwo32#6" );
static_assert(0 x40000000u == TruncToPowerOfTwo<uint32_t>(0 x40000001u),
"TestTruncToPowerOfTwo32#7" );
static_assert(0 x80000000u == TruncToPowerOfTwo<uint32_t>(0 x80000000u),
"TestTruncToPowerOfTwo32#8" );
static_assert(0 == TruncToPowerOfTwo<uint64_t>(UINT64_C(0 )), "TestTruncToPowerOfTwo64#1" );
static_assert(1 == TruncToPowerOfTwo<uint64_t>(UINT64_C(1 )), "TestTruncToPowerOfTwo64#2" );
static_assert(2 == TruncToPowerOfTwo<uint64_t>(UINT64_C(2 )), "TestTruncToPowerOfTwo64#3" );
static_assert(2 == TruncToPowerOfTwo<uint64_t>(UINT64_C(3 )), "TestTruncToPowerOfTwo64#4" );
static_assert(4 == TruncToPowerOfTwo<uint64_t>(UINT64_C(7 )), "TestTruncToPowerOfTwo64#5" );
static_assert(UINT64_C(0 x20000) == TruncToPowerOfTwo<uint64_t>(UINT64_C(0 x3aaaa)),
"TestTruncToPowerOfTwo64#6" );
static_assert(
UINT64_C(0 x4000000000000000) == TruncToPowerOfTwo<uint64_t>(UINT64_C(0 x4000000000000001)),
"TestTruncToPowerOfTwo64#7" );
static_assert(
UINT64_C(0 x8000000000000000) == TruncToPowerOfTwo<uint64_t>(UINT64_C(0 x8000000000000000)),
"TestTruncToPowerOfTwo64#8" );
static_assert(0 == RoundUpToPowerOfTwo<uint32_t>(0 u), "TestRoundUpPowerOfTwo32#1" );
static_assert(1 == RoundUpToPowerOfTwo<uint32_t>(1 u), "TestRoundUpPowerOfTwo32#2" );
static_assert(2 == RoundUpToPowerOfTwo<uint32_t>(2 u), "TestRoundUpPowerOfTwo32#3" );
static_assert(4 == RoundUpToPowerOfTwo<uint32_t>(3 u), "TestRoundUpPowerOfTwo32#4" );
static_assert(8 == RoundUpToPowerOfTwo<uint32_t>(7 u), "TestRoundUpPowerOfTwo32#5" );
static_assert(0 x40000u == RoundUpToPowerOfTwo<uint32_t>(0 x2aaaau),
"TestRoundUpPowerOfTwo32#6" );
static_assert(0 x80000000u == RoundUpToPowerOfTwo<uint32_t>(0 x40000001u),
"TestRoundUpPowerOfTwo32#7" );
static_assert(0 x80000000u == RoundUpToPowerOfTwo<uint32_t>(0 x80000000u),
"TestRoundUpPowerOfTwo32#8" );
static_assert(0 == RoundUpToPowerOfTwo<uint64_t>(UINT64_C(0 )), "TestRoundUpPowerOfTwo64#1" );
static_assert(1 == RoundUpToPowerOfTwo<uint64_t>(UINT64_C(1 )), "TestRoundUpPowerOfTwo64#2" );
static_assert(2 == RoundUpToPowerOfTwo<uint64_t>(UINT64_C(2 )), "TestRoundUpPowerOfTwo64#3" );
static_assert(4 == RoundUpToPowerOfTwo<uint64_t>(UINT64_C(3 )), "TestRoundUpPowerOfTwo64#4" );
static_assert(8 == RoundUpToPowerOfTwo<uint64_t>(UINT64_C(7 )), "TestRoundUpPowerOfTwo64#5" );
static_assert(UINT64_C(0 x40000) == RoundUpToPowerOfTwo<uint64_t>(UINT64_C(0 x2aaaa)),
"TestRoundUpPowerOfTwo64#6" );
static_assert(
UINT64_C(0 x8000000000000000) == RoundUpToPowerOfTwo<uint64_t>(UINT64_C(0 x4000000000000001)),
"TestRoundUpPowerOfTwo64#7" );
static_assert(
UINT64_C(0 x8000000000000000) == RoundUpToPowerOfTwo<uint64_t>(UINT64_C(0 x8000000000000000)),
"TestRoundUpPowerOfTwo64#8" );
static constexpr int64_t kInt32MinMinus1 =
static_cast <int64_t>(std::numeric_limits<int32_t>::min()) - 1 ;
static constexpr int64_t kInt32MaxPlus1 =
static_cast <int64_t>(std::numeric_limits<int32_t>::max()) + 1 ;
static constexpr int64_t kUint32MaxPlus1 =
static_cast <int64_t>(std::numeric_limits<uint32_t>::max()) + 1 ;
TEST(BitUtilsTest, TestIsInt32) {
EXPECT_FALSE(IsInt<int32_t>(1 , -2 ));
EXPECT_TRUE(IsInt<int32_t>(1 , -1 ));
EXPECT_TRUE(IsInt<int32_t>(1 , 0 ));
EXPECT_FALSE(IsInt<int32_t>(1 , 1 ));
EXPECT_FALSE(IsInt<int32_t>(4 , -9 ));
EXPECT_TRUE(IsInt<int32_t>(4 , -8 ));
EXPECT_TRUE(IsInt<int32_t>(4 , 7 ));
EXPECT_FALSE(IsInt<int32_t>(4 , 8 ));
EXPECT_FALSE(IsInt<int32_t>(31 , std::numeric_limits<int32_t>::min()));
EXPECT_FALSE(IsInt<int32_t>(31 , std::numeric_limits<int32_t>::max()));
EXPECT_TRUE(IsInt<int32_t>(32 , std::numeric_limits<int32_t>::min()));
EXPECT_TRUE(IsInt<int32_t>(32 , std::numeric_limits<int32_t>::max()));
}
TEST(BitUtilsTest, TestIsInt64) {
EXPECT_FALSE(IsInt<int64_t>(1 , -2 ));
EXPECT_TRUE(IsInt<int64_t>(1 , -1 ));
EXPECT_TRUE(IsInt<int64_t>(1 , 0 ));
EXPECT_FALSE(IsInt<int64_t>(1 , 1 ));
EXPECT_FALSE(IsInt<int64_t>(4 , -9 ));
EXPECT_TRUE(IsInt<int64_t>(4 , -8 ));
EXPECT_TRUE(IsInt<int64_t>(4 , 7 ));
EXPECT_FALSE(IsInt<int64_t>(4 , 8 ));
EXPECT_FALSE(IsInt<int64_t>(31 , std::numeric_limits<int32_t>::min()));
EXPECT_FALSE(IsInt<int64_t>(31 , std::numeric_limits<int32_t>::max()));
EXPECT_TRUE(IsInt<int64_t>(32 , std::numeric_limits<int32_t>::min()));
EXPECT_TRUE(IsInt<int64_t>(32 , std::numeric_limits<int32_t>::max()));
EXPECT_FALSE(IsInt<int64_t>(32 , kInt32MinMinus1));
EXPECT_FALSE(IsInt<int64_t>(32 , kInt32MaxPlus1));
EXPECT_FALSE(IsInt<int64_t>(63 , std::numeric_limits<int64_t>::min()));
EXPECT_FALSE(IsInt<int64_t>(63 , std::numeric_limits<int64_t>::max()));
EXPECT_TRUE(IsInt<int64_t>(64 , std::numeric_limits<int64_t>::min()));
EXPECT_TRUE(IsInt<int64_t>(64 , std::numeric_limits<int64_t>::max()));
}
static_assert(!IsInt<1 , int32_t>(-2 ), "TestIsInt32#1" );
static_assert(IsInt<1 , int32_t>(-1 ), "TestIsInt32#2" );
static_assert(IsInt<1 , int32_t>(0 ), "TestIsInt32#3" );
static_assert(!IsInt<1 , int32_t>(1 ), "TestIsInt32#4" );
static_assert(!IsInt<4 , int32_t>(-9 ), "TestIsInt32#5" );
static_assert(IsInt<4 , int32_t>(-8 ), "TestIsInt32#6" );
static_assert(IsInt<4 , int32_t>(7 ), "TestIsInt32#7" );
static_assert(!IsInt<4 , int32_t>(8 ), "TestIsInt32#8" );
static_assert(!IsInt<31 , int32_t>(std::numeric_limits<int32_t>::min()), "TestIsInt32#9" );
static_assert(!IsInt<31 , int32_t>(std::numeric_limits<int32_t>::max()), "TestIsInt32#10" );
static_assert(IsInt<32 , int32_t>(std::numeric_limits<int32_t>::min()), "TestIsInt32#11" );
static_assert(IsInt<32 , int32_t>(std::numeric_limits<int32_t>::max()), "TestIsInt32#12" );
static_assert(!IsInt<1 , int64_t>(-2 ), "TestIsInt64#1" );
static_assert(IsInt<1 , int64_t>(-1 ), "TestIsInt64#2" );
static_assert(IsInt<1 , int64_t>(0 ), "TestIsInt64#3" );
static_assert(!IsInt<1 , int64_t>(1 ), "TestIsInt64#4" );
static_assert(!IsInt<4 , int64_t>(-9 ), "TestIsInt64#5" );
static_assert(IsInt<4 , int64_t>(-8 ), "TestIsInt64#6" );
static_assert(IsInt<4 , int64_t>(7 ), "TestIsInt64#7" );
static_assert(!IsInt<4 , int64_t>(8 ), "TestIsInt64#8" );
static_assert(!IsInt<31 , int64_t>(std::numeric_limits<int32_t>::min()), "TestIsInt64#9" );
static_assert(!IsInt<31 , int64_t>(std::numeric_limits<int32_t>::max()), "TestIsInt64#10" );
static_assert(IsInt<32 , int64_t>(std::numeric_limits<int32_t>::min()), "TestIsInt64#11" );
static_assert(IsInt<32 , int64_t>(std::numeric_limits<int32_t>::max()), "TestIsInt64#12" );
static_assert(!IsInt<32 , int64_t>(kInt32MinMinus1), "TestIsInt64#13" );
static_assert(!IsInt<32 , int64_t>(kInt32MaxPlus1), "TestIsInt64#14" );
static_assert(!IsInt<63 , int64_t>(std::numeric_limits<int64_t>::min()), "TestIsInt64#15" );
static_assert(!IsInt<63 , int64_t>(std::numeric_limits<int64_t>::max()), "TestIsInt64#16" );
static_assert(IsInt<64 , int64_t>(std::numeric_limits<int64_t>::min()), "TestIsInt64#17" );
static_assert(IsInt<64 , int64_t>(std::numeric_limits<int64_t>::max()), "TestIsInt64#18" );
static_assert(!IsUint<1 , int32_t>(-1 ), "TestIsUint32#1" );
static_assert(IsUint<1 , int32_t>(0 ), "TestIsUint32#2" );
static_assert(IsUint<1 , int32_t>(1 ), "TestIsUint32#3" );
static_assert(!IsUint<1 , int32_t>(2 ), "TestIsUint32#4" );
static_assert(!IsUint<4 , int32_t>(-1 ), "TestIsUint32#5" );
static_assert(IsUint<4 , int32_t>(0 ), "TestIsUint32#6" );
static_assert(IsUint<4 , int32_t>(15 ), "TestIsUint32#7" );
static_assert(!IsUint<4 , int32_t>(16 ), "TestIsUint32#8" );
static_assert(!IsUint<30 , int32_t>(std::numeric_limits<int32_t>::max()), "TestIsUint32#9" );
static_assert(IsUint<31 , int32_t>(std::numeric_limits<int32_t>::max()), "TestIsUint32#10" );
static_assert(!IsUint<32 , int32_t>(-1 ), "TestIsUint32#11" );
static_assert(IsUint<32 , int32_t>(0 ), "TestIsUint32#11" );
static_assert(IsUint<32 , uint32_t>(static_cast <uint32_t>(-1 )), "TestIsUint32#12" );
static_assert(!IsUint<1 , int64_t>(-1 ), "TestIsUint64#1" );
static_assert(IsUint<1 , int64_t>(0 ), "TestIsUint64#2" );
static_assert(IsUint<1 , int64_t>(1 ), "TestIsUint64#3" );
static_assert(!IsUint<1 , int64_t>(2 ), "TestIsUint64#4" );
static_assert(!IsUint<4 , int64_t>(-1 ), "TestIsUint64#5" );
static_assert(IsUint<4 , int64_t>(0 ), "TestIsUint64#6" );
static_assert(IsUint<4 , int64_t>(15 ), "TestIsUint64#7" );
static_assert(!IsUint<4 , int64_t>(16 ), "TestIsUint64#8" );
static_assert(!IsUint<30 , int64_t>(std::numeric_limits<int32_t>::max()), "TestIsUint64#9" );
static_assert(IsUint<31 , int64_t>(std::numeric_limits<int32_t>::max()), "TestIsUint64#10" );
static_assert(!IsUint<62 , int64_t>(std::numeric_limits<int64_t>::max()), "TestIsUint64#11" );
static_assert(IsUint<63 , int64_t>(std::numeric_limits<int64_t>::max()), "TestIsUint64#12" );
static_assert(!IsUint<64 , int64_t>(-1 ), "TestIsUint64#13" );
static_assert(IsUint<64 , int64_t>(0 ), "TestIsUint64#14" );
static_assert(IsUint<64 , uint64_t>(static_cast <uint32_t>(-1 )), "TestIsUint64#15" );
static_assert(!IsAbsoluteUint<1 , int32_t>(-2 ), "TestIsAbsoluteUint32#1" );
static_assert(IsAbsoluteUint<1 , int32_t>(-1 ), "TestIsAbsoluteUint32#2" );
static_assert(IsAbsoluteUint<1 , int32_t>(0 ), "TestIsAbsoluteUint32#3" );
static_assert(IsAbsoluteUint<1 , int32_t>(1 ), "TestIsAbsoluteUint32#4" );
static_assert(!IsAbsoluteUint<1 , int32_t>(2 ), "TestIsAbsoluteUint32#5" );
static_assert(!IsAbsoluteUint<4 , int32_t>(-16 ), "TestIsAbsoluteUint32#6" );
static_assert(IsAbsoluteUint<4 , int32_t>(-15 ), "TestIsAbsoluteUint32#7" );
static_assert(IsAbsoluteUint<4 , int32_t>(0 ), "TestIsAbsoluteUint32#8" );
static_assert(IsAbsoluteUint<4 , int32_t>(15 ), "TestIsAbsoluteUint32#9" );
static_assert(!IsAbsoluteUint<4 , int32_t>(16 ), "TestIsAbsoluteUint32#10" );
static_assert(!IsAbsoluteUint<30 , int32_t>(std::numeric_limits<int32_t>::max()),
"TestIsAbsoluteUint32#11" );
static_assert(IsAbsoluteUint<31 , int32_t>(std::numeric_limits<int32_t>::max()),
"TestIsAbsoluteUint32#12" );
static_assert(!IsAbsoluteUint<31 , int32_t>(std::numeric_limits<int32_t>::min()),
"TestIsAbsoluteUint32#13" );
static_assert(IsAbsoluteUint<31 , int32_t>(std::numeric_limits<int32_t>::min() + 1 ),
"TestIsAbsoluteUint32#14" );
static_assert(IsAbsoluteUint<32 , int32_t>(std::numeric_limits<int32_t>::max()),
"TestIsAbsoluteUint32#15" );
static_assert(IsAbsoluteUint<32 , int32_t>(std::numeric_limits<int32_t>::min()),
"TestIsAbsoluteUint32#16" );
static_assert(IsAbsoluteUint<32 , int32_t>(0 ), "TestIsAbsoluteUint32#17" );
static_assert(!IsAbsoluteUint<1 , int64_t>(-2 ), "TestIsAbsoluteUint64#1" );
static_assert(IsAbsoluteUint<1 , int64_t>(-1 ), "TestIsAbsoluteUint64#2" );
static_assert(IsAbsoluteUint<1 , int64_t>(0 ), "TestIsAbsoluteUint64#3" );
static_assert(IsAbsoluteUint<1 , int64_t>(1 ), "TestIsAbsoluteUint64#4" );
static_assert(!IsAbsoluteUint<1 , int64_t>(2 ), "TestIsAbsoluteUint64#5" );
static_assert(!IsAbsoluteUint<4 , int64_t>(-16 ), "TestIsAbsoluteUint64#6" );
static_assert(IsAbsoluteUint<4 , int64_t>(-15 ), "TestIsAbsoluteUint64#7" );
static_assert(IsAbsoluteUint<4 , int64_t>(0 ), "TestIsAbsoluteUint64#8" );
static_assert(IsAbsoluteUint<4 , int64_t>(15 ), "TestIsAbsoluteUint64#9" );
static_assert(!IsAbsoluteUint<4 , int64_t>(16 ), "TestIsAbsoluteUint64#10" );
static_assert(!IsAbsoluteUint<30 , int64_t>(std::numeric_limits<int32_t>::max()),
"TestIsAbsoluteUint64#11" );
static_assert(IsAbsoluteUint<31 , int64_t>(std::numeric_limits<int32_t>::max()),
"TestIsAbsoluteUint64#12" );
static_assert(!IsAbsoluteUint<31 , int64_t>(std::numeric_limits<int32_t>::min()),
"TestIsAbsoluteUint64#13" );
static_assert(IsAbsoluteUint<31 , int64_t>(std::numeric_limits<int32_t>::min() + 1 ),
"TestIsAbsoluteUint64#14" );
static_assert(IsAbsoluteUint<32 , int64_t>(std::numeric_limits<int32_t>::max()),
"TestIsAbsoluteUint64#15" );
static_assert(IsAbsoluteUint<32 , int64_t>(std::numeric_limits<int32_t>::min()),
"TestIsAbsoluteUint64#16" );
static_assert(!IsAbsoluteUint<62 , int64_t>(std::numeric_limits<int64_t>::max()),
"TestIsAbsoluteUint64#17" );
static_assert(IsAbsoluteUint<63 , int64_t>(std::numeric_limits<int64_t>::max()),
"TestIsAbsoluteUint64#18" );
static_assert(!IsAbsoluteUint<63 , int64_t>(std::numeric_limits<int64_t>::min()),
"TestIsAbsoluteUint64#19" );
static_assert(IsAbsoluteUint<63 , int64_t>(std::numeric_limits<int64_t>::min() + 1 ),
"TestIsAbsoluteUint64#20" );
static_assert(IsAbsoluteUint<64 , int64_t>(std::numeric_limits<int64_t>::max()),
"TestIsAbsoluteUint64#21" );
static_assert(IsAbsoluteUint<64 , int64_t>(std::numeric_limits<int64_t>::min()),
"TestIsAbsoluteUint64#22" );
static_assert(!IsAbsoluteUint<32 , int64_t>(-kUint32MaxPlus1), "TestIsAbsoluteUint64#23" );
static_assert(IsAbsoluteUint<32 , int64_t>(-kUint32MaxPlus1 + 1 ), "TestIsAbsoluteUint64#24" );
static_assert(IsAbsoluteUint<32 , int64_t>(0 ), "TestIsAbsoluteUint64#25" );
static_assert(IsAbsoluteUint<64 , int64_t>(0 ), "TestIsAbsoluteUint64#26" );
static_assert(IsAbsoluteUint<32 , int64_t>(std::numeric_limits<uint32_t>::max()),
"TestIsAbsoluteUint64#27" );
static_assert(!IsAbsoluteUint<32 , int64_t>(kUint32MaxPlus1), "TestIsAbsoluteUint64#28" );
static_assert(MaskLeastSignificant(0 ) == 0 b0, "TestMaskLeastSignificant#1" );
static_assert(MaskLeastSignificant(1 ) == 0 b1, "TestMaskLeastSignificant#2" );
static_assert(MaskLeastSignificant(2 ) == 0 b11, "TestMaskLeastSignificant#3" );
static_assert(MaskLeastSignificant<uint8_t>(8 ) == 0 xFF, "TestMaskLeastSignificant#4" );
static_assert(MaskLeastSignificant<int8_t>(8 ) == 0 xFF, "TestMaskLeastSignificant#5" );
static_assert(MaskLeastSignificant<uint64_t>(63 ) == (std::numeric_limits<uint64_t>::max() >> 1 u),
"TestMaskLeastSignificant#6" );
static_assert(BitFieldClear(0 xFF, /*lsb=*/0, /*width=*/0) == 0xFF, "TestBitFieldClear#1");
static_assert(BitFieldClear(std::numeric_limits<uint32_t>::max(), /*lsb=*/0, /*width=*/32) == 0x0,
"TestBitFieldClear#2" );
static_assert(BitFieldClear(std::numeric_limits<int32_t>::max(), /*lsb=*/0, /*width=*/32) == 0x0,
"TestBitFieldClear#3" );
static_assert(BitFieldClear(0 xFF, /*lsb=*/0, /*width=*/2) == 0b11111100, "TestBitFieldClear#4");
static_assert(BitFieldClear(0 xFF, /*lsb=*/0, /*width=*/3) == 0b11111000, "TestBitFieldClear#5");
static_assert(BitFieldClear(0 xFF, /*lsb=*/1, /*width=*/3) == 0b11110001, "TestBitFieldClear#6");
static_assert(BitFieldClear(0 xFF, /*lsb=*/2, /*width=*/3) == 0b11100011, "TestBitFieldClear#7");
static_assert(BitFieldExtract(0 xFF, /*lsb=*/0, /*width=*/0) == 0x0, "TestBitFieldExtract#1");
static_assert(BitFieldExtract(std::numeric_limits<uint32_t>::max(), /*lsb=*/0, /*width=*/32)
== std::numeric_limits<uint32_t>::max(),
"TestBitFieldExtract#2" );
static_assert(BitFieldExtract(std::numeric_limits<int32_t>::max(), /*lsb=*/0, /*width=*/32)
== std::numeric_limits<int32_t>::max(),
"TestBitFieldExtract#3" );
static_assert(BitFieldExtract(static_cast <uint32_t>(0 xFF), /*lsb=*/0, /*width=*/2) == 0b00000011,
"TestBitFieldExtract#4" );
static_assert(BitFieldExtract(static_cast <uint32_t>(0 xFF), /*lsb=*/0, /*width=*/3) == 0b00000111,
"TestBitFieldExtract#5" );
static_assert(BitFieldExtract(static_cast <uint32_t>(0 xFF), /*lsb=*/1, /*width=*/3) == 0b00000111,
"TestBitFieldExtract#6" );
static_assert(BitFieldExtract(static_cast <uint32_t>(0 xFF), /*lsb=*/2, /*width=*/3) == 0b00000111,
"TestBitFieldExtract#7" );
static_assert(BitFieldExtract(static_cast <uint32_t>(0 xFF), /*lsb=*/3, /*width=*/3) == 0b00000111,
"TestBitFieldExtract#8" );
static_assert(BitFieldExtract(static_cast <uint32_t>(0 xFF), /*lsb=*/8, /*width=*/3) == 0b00000000,
"TestBitFieldExtract#9" );
static_assert(BitFieldExtract(static_cast <uint32_t>(0 xFF), /*lsb=*/7, /*width=*/3) == 0b00000001,
"TestBitFieldExtract#10" );
static_assert(BitFieldExtract(static_cast <uint32_t>(0 xFF), /*lsb=*/6, /*width=*/3) == 0b00000011,
"TestBitFieldExtract#11" );
static_assert(BitFieldExtract(0 xFF, /*lsb=*/0, /*width=*/2) == -1, "TestBitFieldExtract#12");
static_assert(BitFieldExtract(0 xFF, /*lsb=*/0, /*width=*/3) == -1, "TestBitFieldExtract#13");
static_assert(BitFieldExtract(0 xFF, /*lsb=*/1, /*width=*/3) == -1, "TestBitFieldExtract#14");
static_assert(BitFieldExtract(0 xFF, /*lsb=*/2, /*width=*/3) == -1, "TestBitFieldExtract#15");
static_assert(BitFieldExtract(0 xFF, /*lsb=*/3, /*width=*/3) == -1, "TestBitFieldExtract#16");
static_assert(BitFieldExtract(0 xFF, /*lsb=*/8, /*width=*/3) == 0b00000000,
"TestBitFieldExtract#17" );
static_assert(BitFieldExtract(0 xFF, /*lsb=*/7, /*width=*/3) == 0b00000001,
"TestBitFieldExtract#18" );
static_assert(BitFieldExtract(0 xFF, /*lsb=*/6, /*width=*/3) == 0b00000011,
"TestBitFieldExtract#19" );
static_assert(BitFieldExtract(static_cast <uint8_t>(0 b01101010), /*lsb=*/2, /*width=*/4)
== 0 b00001010,
"TestBitFieldExtract#20" );
static_assert(BitFieldExtract(static_cast <int8_t>(0 b01101010), /*lsb=*/2, /*width=*/4)
== static_cast <int8_t>(0 b11111010),
"TestBitFieldExtract#21" );
static_assert(BitFieldInsert(0 xFF, /*data=*/0x0, /*lsb=*/0, /*width=*/0) == 0xFF,
"TestBitFieldInsert#1" );
static_assert(BitFieldInsert(std::numeric_limits<uint32_t>::max(),
/*data=*/std::numeric_limits<uint32_t>::max(),
/*lsb=*/0,
/*width=*/32)
== std::numeric_limits<uint32_t>::max(),
"TestBitFieldInsert#2" );
static_assert(BitFieldInsert(std::numeric_limits<int32_t>::max(),
/*data=*/std::numeric_limits<uint32_t>::max(),
/*lsb=*/0,
/*width=*/32)
== std::numeric_limits<uint32_t>::max(),
"TestBitFieldInsert#3" );
static_assert(BitFieldInsert(0 u,
/*data=*/std::numeric_limits<uint32_t>::max(),
/*lsb=*/0,
/*width=*/32)
== std::numeric_limits<uint32_t>::max(),
"TestBitFieldInsert#4" );
static_assert(BitFieldInsert(-(-0 ),
/*data=*/std::numeric_limits<uint32_t>::max(),
/*lsb=*/0,
/*width=*/32)
== std::numeric_limits<uint32_t>::max(),
"TestBitFieldInsert#5" );
static_assert(BitFieldInsert(0 x00, /*data=*/0b11u, /*lsb=*/0, /*width=*/2) == 0b00000011,
"TestBitFieldInsert#6" );
static_assert(BitFieldInsert(0 x00, /*data=*/0b111u, /*lsb=*/0, /*width=*/3) == 0b00000111,
"TestBitFieldInsert#7" );
static_assert(BitFieldInsert(0 x00, /*data=*/0b111u, /*lsb=*/1, /*width=*/3) == 0b00001110,
"TestBitFieldInsert#8" );
static_assert(BitFieldInsert(0 x00, /*data=*/0b111u, /*lsb=*/2, /*width=*/3) == 0b00011100,
"TestBitFieldInsert#9" );
static_assert(BitFieldInsert(0 b01011100, /*data=*/0b1101u, /*lsb=*/4, /*width=*/4) == 0b11011100,
"TestBitFieldInsert#10" );
template <typename Container>
void CheckElements(const std::initializer_list<uint32_t>& expected, const Container& elements) {
auto expected_it = expected.begin();
auto element_it = elements.begin();
size_t idx = 0 u;
while (expected_it != expected.end() && element_it != elements.end()) {
EXPECT_EQ(*expected_it, *element_it) << idx;
++idx;
++expected_it;
++element_it;
}
ASSERT_TRUE(expected_it == expected.end() && element_it == elements.end())
<< std::boolalpha << (expected_it == expected.end()) << " " << (element_it == elements.end());
}
TEST(BitUtilsTest, TestLowToHighBits32) {
CheckElements({}, LowToHighBits<uint32_t>(0 u));
CheckElements({0 }, LowToHighBits<uint32_t>(1 u));
CheckElements({15 }, LowToHighBits<uint32_t>(0 x8000u));
CheckElements({31 }, LowToHighBits<uint32_t>(0 x80000000u));
CheckElements({0 , 31 }, LowToHighBits<uint32_t>(0 x80000001u));
CheckElements({0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 31 }, LowToHighBits<uint32_t>(0 x800000ffu));
CheckElements({0 , 8 , 16 , 24 , 31 }, LowToHighBits<uint32_t>(0 x81010101u));
CheckElements({16 , 17 , 30 , 31 }, LowToHighBits<uint32_t>(0 xc0030000u));
CheckElements({0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ,
16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 , 30 , 31 },
LowToHighBits<uint32_t>(0 xffffffffu));
}
TEST(BitUtilsTest, TestLowToHighBits64) {
CheckElements({}, LowToHighBits<uint64_t>(UINT64_C(0 )));
CheckElements({0 }, LowToHighBits<uint64_t>(UINT64_C(1 )));
CheckElements({32 }, LowToHighBits<uint64_t>(UINT64_C(0 x100000000)));
CheckElements({63 }, LowToHighBits<uint64_t>(UINT64_C(0 x8000000000000000)));
CheckElements({0 , 63 }, LowToHighBits<uint64_t>(UINT64_C(0 x8000000000000001)));
CheckElements({0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 63 },
LowToHighBits<uint64_t>(UINT64_C(0 x80000000000000ff)));
CheckElements({0 , 8 , 16 , 24 , 32 , 40 , 48 , 56 , 63 },
LowToHighBits<uint64_t>(UINT64_C(0 x8101010101010101)));
CheckElements({16 , 17 , 62 , 63 }, LowToHighBits<uint64_t>(UINT64_C(0 xc000000000030000)));
CheckElements({0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ,
16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 , 30 , 31 ,
32 , 33 , 34 , 35 , 36 , 37 , 38 , 39 , 40 , 41 , 42 , 43 , 44 , 45 , 46 , 47 ,
48 , 49 , 50 , 51 , 52 , 53 , 54 , 55 , 56 , 57 , 58 , 59 , 60 , 61 , 62 , 63 },
LowToHighBits<uint64_t>(UINT64_C(0 xffffffffffffffff)));
}
TEST(BitUtilsTest, TestHighToLowBits32) {
CheckElements({}, HighToLowBits<uint32_t>(0 u));
CheckElements({0 }, HighToLowBits<uint32_t>(1 u));
CheckElements({15 }, HighToLowBits<uint32_t>(0 x8000u));
CheckElements({31 }, HighToLowBits<uint32_t>(0 x80000000u));
CheckElements({31 , 0 }, HighToLowBits<uint32_t>(0 x80000001u));
CheckElements({31 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0 }, HighToLowBits<uint32_t>(0 x800000ffu));
CheckElements({31 , 24 , 16 , 8 , 0 }, HighToLowBits<uint32_t>(0 x81010101u));
CheckElements({31 , 30 , 17 , 16 }, HighToLowBits<uint32_t>(0 xc0030000u));
CheckElements({31 , 30 , 29 , 28 , 27 , 26 , 25 , 24 , 23 , 22 , 21 , 20 , 19 , 18 , 17 , 16 ,
15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0 },
HighToLowBits<uint32_t>(0 xffffffffu));
}
TEST(BitUtilsTest, TestHighToLowBits64) {
CheckElements({}, HighToLowBits<uint64_t>(UINT64_C(0 )));
CheckElements({0 }, HighToLowBits<uint64_t>(UINT64_C(1 )));
CheckElements({32 }, HighToLowBits<uint64_t>(UINT64_C(0 x100000000)));
CheckElements({63 }, HighToLowBits<uint64_t>(UINT64_C(0 x8000000000000000)));
CheckElements({63 , 0 }, HighToLowBits<uint64_t>(UINT64_C(0 x8000000000000001)));
CheckElements({63 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0 },
HighToLowBits<uint64_t>(UINT64_C(0 x80000000000000ff)));
CheckElements({63 , 56 , 48 , 40 , 32 , 24 , 16 , 8 , 0 },
HighToLowBits<uint64_t>(UINT64_C(0 x8101010101010101)));
CheckElements({63 , 62 , 17 , 16 }, HighToLowBits<uint64_t>(UINT64_C(0 xc000000000030000)));
CheckElements({63 , 62 , 61 , 60 , 59 , 58 , 57 , 56 , 55 , 54 , 53 , 52 , 51 , 50 , 49 , 48 ,
47 , 46 , 45 , 44 , 43 , 42 , 41 , 40 , 39 , 38 , 37 , 36 , 35 , 34 , 33 , 32 ,
31 , 30 , 29 , 28 , 27 , 26 , 25 , 24 , 23 , 22 , 21 , 20 , 19 , 18 , 17 , 16 ,
15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0 },
HighToLowBits<uint64_t>(UINT64_C(0 xffffffffffffffff)));
}
} // namespace art
Messung V0.5 in Prozent C=90 H=95 G=92
¤ Dauer der Verarbeitung: 0.17 Sekunden
(vorverarbeitet am 2026-06-29)
¤
*© Formatika GbR, Deutschland