181e3e7e5SSchrodinger ZHU Yifan //===-- Unittests for bitmask ---------------------------------------------===// 281e3e7e5SSchrodinger ZHU Yifan // 381e3e7e5SSchrodinger ZHU Yifan // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 481e3e7e5SSchrodinger ZHU Yifan // See https://llvm.org/LICENSE.txt for license information. 581e3e7e5SSchrodinger ZHU Yifan // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 681e3e7e5SSchrodinger ZHU Yifan // 781e3e7e5SSchrodinger ZHU Yifan //===----------------------------------------------------------------------===// 881e3e7e5SSchrodinger ZHU Yifan 981e3e7e5SSchrodinger ZHU Yifan #include "src/__support/HashTable/bitmask.h" 10*5ff3ff33SPetr Hosek #include "src/__support/macros/config.h" 1181e3e7e5SSchrodinger ZHU Yifan #include "test/UnitTest/Test.h" 12*5ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL { 1381e3e7e5SSchrodinger ZHU Yifan namespace internal { 1481e3e7e5SSchrodinger ZHU Yifan 1586e99e11SSchrodinger ZHU Yifan using ShortBitMask = BitMaskAdaptor<uint16_t, 1>; 1686e99e11SSchrodinger ZHU Yifan using LargeBitMask = BitMaskAdaptor<uint64_t, 8>; 1781e3e7e5SSchrodinger ZHU Yifan 1881e3e7e5SSchrodinger ZHU Yifan TEST(LlvmLibcHashTableBitMaskTest, SingleBitStrideLowestSetBit) { 1981e3e7e5SSchrodinger ZHU Yifan uint16_t data = 0xffff; 2081e3e7e5SSchrodinger ZHU Yifan for (size_t i = 0; i < 16; ++i) { 2181e3e7e5SSchrodinger ZHU Yifan if (ShortBitMask{data}.any_bit_set()) { 2281e3e7e5SSchrodinger ZHU Yifan ASSERT_EQ(ShortBitMask{data}.lowest_set_bit_nonzero(), i); 2381e3e7e5SSchrodinger ZHU Yifan data <<= 1; 2481e3e7e5SSchrodinger ZHU Yifan } 2581e3e7e5SSchrodinger ZHU Yifan } 2681e3e7e5SSchrodinger ZHU Yifan } 2781e3e7e5SSchrodinger ZHU Yifan 2881e3e7e5SSchrodinger ZHU Yifan TEST(LlvmLibcHashTableBitMaskTest, MultiBitStrideLowestSetBit) { 2981e3e7e5SSchrodinger ZHU Yifan uint64_t data = 0xffff'ffff'ffff'ffff; 3081e3e7e5SSchrodinger ZHU Yifan for (size_t i = 0; i < 8; ++i) { 3181e3e7e5SSchrodinger ZHU Yifan for (size_t j = 0; j < 8; ++j) { 3281e3e7e5SSchrodinger ZHU Yifan if (LargeBitMask{data}.any_bit_set()) { 3381e3e7e5SSchrodinger ZHU Yifan ASSERT_EQ(LargeBitMask{data}.lowest_set_bit_nonzero(), i); 3481e3e7e5SSchrodinger ZHU Yifan data <<= 1; 3581e3e7e5SSchrodinger ZHU Yifan } 3681e3e7e5SSchrodinger ZHU Yifan } 3781e3e7e5SSchrodinger ZHU Yifan } 3881e3e7e5SSchrodinger ZHU Yifan } 3981e3e7e5SSchrodinger ZHU Yifan 4081e3e7e5SSchrodinger ZHU Yifan TEST(LlvmLibcHashTableBitMaskTest, SingleBitStrideIteration) { 4181e3e7e5SSchrodinger ZHU Yifan using Iter = IteratableBitMaskAdaptor<ShortBitMask>; 4281e3e7e5SSchrodinger ZHU Yifan uint16_t data = 0xffff; 4381e3e7e5SSchrodinger ZHU Yifan for (size_t i = 0; i < 16; ++i) { 4481e3e7e5SSchrodinger ZHU Yifan Iter iter = {data}; 4581e3e7e5SSchrodinger ZHU Yifan size_t j = i; 4681e3e7e5SSchrodinger ZHU Yifan for (auto x : iter) { 4781e3e7e5SSchrodinger ZHU Yifan ASSERT_EQ(x, j); 4881e3e7e5SSchrodinger ZHU Yifan j++; 4981e3e7e5SSchrodinger ZHU Yifan } 5081e3e7e5SSchrodinger ZHU Yifan ASSERT_EQ(j, size_t{16}); 5181e3e7e5SSchrodinger ZHU Yifan data <<= 1; 5281e3e7e5SSchrodinger ZHU Yifan } 5381e3e7e5SSchrodinger ZHU Yifan } 5481e3e7e5SSchrodinger ZHU Yifan 5581e3e7e5SSchrodinger ZHU Yifan TEST(LlvmLibcHashTableBitMaskTest, MultiBitStrideIteration) { 5681e3e7e5SSchrodinger ZHU Yifan using Iter = IteratableBitMaskAdaptor<LargeBitMask>; 5786e99e11SSchrodinger ZHU Yifan uint64_t data = 0x8080808080808080ul; 5881e3e7e5SSchrodinger ZHU Yifan for (size_t i = 0; i < 8; ++i) { 5981e3e7e5SSchrodinger ZHU Yifan Iter iter = {data}; 6081e3e7e5SSchrodinger ZHU Yifan size_t j = i; 6181e3e7e5SSchrodinger ZHU Yifan for (auto x : iter) { 6281e3e7e5SSchrodinger ZHU Yifan ASSERT_EQ(x, j); 6381e3e7e5SSchrodinger ZHU Yifan j++; 6481e3e7e5SSchrodinger ZHU Yifan } 6581e3e7e5SSchrodinger ZHU Yifan ASSERT_EQ(j, size_t{8}); 6681e3e7e5SSchrodinger ZHU Yifan data <<= Iter::STRIDE; 6781e3e7e5SSchrodinger ZHU Yifan } 6881e3e7e5SSchrodinger ZHU Yifan } 6981e3e7e5SSchrodinger ZHU Yifan } // namespace internal 70*5ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL 71