// SPDX-License-Identifier: MIT #include #include #include "Utils/Allocator/FlexBitSet.h" #include TEST_CASE("FlexBitSet - Sizing") { // Ensure that FlexBitSet sizing is correct. // Size of zero shouldn't take any space. CHECK(FEXCore::FlexBitSet::SizeInBytes(0) == 0); CHECK(FEXCore::FlexBitSet::SizeInBytes(0) == 0); CHECK(FEXCore::FlexBitSet::SizeInBytes(0) == 0); CHECK(FEXCore::FlexBitSet::SizeInBytes(0) == 0); CHECK(FEXCore::FlexBitSet::SizeInBits(0) == 0); CHECK(FEXCore::FlexBitSet::SizeInBits(0) == 0); CHECK(FEXCore::FlexBitSet::SizeInBits(0) == 0); CHECK(FEXCore::FlexBitSet::SizeInBits(0) == 0); // Size of 1 should take one sizeof(ElementSize) size CHECK(FEXCore::FlexBitSet::SizeInBytes(1) == sizeof(uint8_t)); CHECK(FEXCore::FlexBitSet::SizeInBytes(1) == sizeof(uint16_t)); CHECK(FEXCore::FlexBitSet::SizeInBytes(1) == sizeof(uint32_t)); CHECK(FEXCore::FlexBitSet::SizeInBytes(1) == sizeof(uint64_t)); CHECK(FEXCore::FlexBitSet::SizeInBits(1) == sizeof(uint8_t) * 8); CHECK(FEXCore::FlexBitSet::SizeInBits(1) == sizeof(uint16_t) * 8); CHECK(FEXCore::FlexBitSet::SizeInBits(1) == sizeof(uint32_t) * 8); CHECK(FEXCore::FlexBitSet::SizeInBits(1) == sizeof(uint64_t) * 8); // Size of `sizeof(ElementSize) * 8` should take one sizeof(ElementSize) size CHECK(FEXCore::FlexBitSet::SizeInBytes(sizeof(uint8_t) * 8) == sizeof(uint8_t)); CHECK(FEXCore::FlexBitSet::SizeInBytes(sizeof(uint16_t) * 8) == sizeof(uint16_t)); CHECK(FEXCore::FlexBitSet::SizeInBytes(sizeof(uint32_t) * 8) == sizeof(uint32_t)); CHECK(FEXCore::FlexBitSet::SizeInBytes(sizeof(uint64_t) * 8) == sizeof(uint64_t)); CHECK(FEXCore::FlexBitSet::SizeInBits(sizeof(uint8_t) * 8) == sizeof(uint8_t) * 8); CHECK(FEXCore::FlexBitSet::SizeInBits(sizeof(uint16_t) * 8) == sizeof(uint16_t) * 8); CHECK(FEXCore::FlexBitSet::SizeInBits(sizeof(uint32_t) * 8) == sizeof(uint32_t) * 8); CHECK(FEXCore::FlexBitSet::SizeInBits(sizeof(uint64_t) * 8) == sizeof(uint64_t) * 8); } TEST_CASE("FlexBitSet - Limit") { // Ensure that the FlexBitSet doesn't read past the limits, and returns correct indexes. const auto Size = 4096 * 3; auto Ptr = mmap(nullptr, Size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); auto PtrMiddle = reinterpret_cast(reinterpret_cast(Ptr) + 4096); REQUIRE(mprotect(PtrMiddle, 4096, PROT_READ | PROT_WRITE) != -1); using ElementType = uint8_t; const size_t NumElements = 4096 * 8; auto FlexBit = reinterpret_cast*>(PtrMiddle); for (size_t i = 0; i < NumElements; ++i) { auto Result = FlexBit->ForwardScanForRange(i, 1, NumElements); CHECK(Result.FoundElement == i); } for (size_t i = 0; i < NumElements; ++i) { auto Result = FlexBit->BackwardScanForRange(i, 1, 0); CHECK(Result.FoundElement == i); } }