xref: /llvm-project/libc/test/src/__support/HashTable/bitmask_test.cpp (revision 5ff3ff33ff930e4ec49da7910612d8a41eb068cb)
1 //===-- Unittests for bitmask ---------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "src/__support/HashTable/bitmask.h"
10 #include "src/__support/macros/config.h"
11 #include "test/UnitTest/Test.h"
12 namespace LIBC_NAMESPACE_DECL {
13 namespace internal {
14 
15 using ShortBitMask = BitMaskAdaptor<uint16_t, 1>;
16 using LargeBitMask = BitMaskAdaptor<uint64_t, 8>;
17 
18 TEST(LlvmLibcHashTableBitMaskTest, SingleBitStrideLowestSetBit) {
19   uint16_t data = 0xffff;
20   for (size_t i = 0; i < 16; ++i) {
21     if (ShortBitMask{data}.any_bit_set()) {
22       ASSERT_EQ(ShortBitMask{data}.lowest_set_bit_nonzero(), i);
23       data <<= 1;
24     }
25   }
26 }
27 
28 TEST(LlvmLibcHashTableBitMaskTest, MultiBitStrideLowestSetBit) {
29   uint64_t data = 0xffff'ffff'ffff'ffff;
30   for (size_t i = 0; i < 8; ++i) {
31     for (size_t j = 0; j < 8; ++j) {
32       if (LargeBitMask{data}.any_bit_set()) {
33         ASSERT_EQ(LargeBitMask{data}.lowest_set_bit_nonzero(), i);
34         data <<= 1;
35       }
36     }
37   }
38 }
39 
40 TEST(LlvmLibcHashTableBitMaskTest, SingleBitStrideIteration) {
41   using Iter = IteratableBitMaskAdaptor<ShortBitMask>;
42   uint16_t data = 0xffff;
43   for (size_t i = 0; i < 16; ++i) {
44     Iter iter = {data};
45     size_t j = i;
46     for (auto x : iter) {
47       ASSERT_EQ(x, j);
48       j++;
49     }
50     ASSERT_EQ(j, size_t{16});
51     data <<= 1;
52   }
53 }
54 
55 TEST(LlvmLibcHashTableBitMaskTest, MultiBitStrideIteration) {
56   using Iter = IteratableBitMaskAdaptor<LargeBitMask>;
57   uint64_t data = 0x8080808080808080ul;
58   for (size_t i = 0; i < 8; ++i) {
59     Iter iter = {data};
60     size_t j = i;
61     for (auto x : iter) {
62       ASSERT_EQ(x, j);
63       j++;
64     }
65     ASSERT_EQ(j, size_t{8});
66     data <<= Iter::STRIDE;
67   }
68 }
69 } // namespace internal
70 } // namespace LIBC_NAMESPACE_DECL
71