xref: /llvm-project/libc/test/src/__support/HashTable/bitmask_test.cpp (revision 5ff3ff33ff930e4ec49da7910612d8a41eb068cb)
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