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"
12namespace LIBC_NAMESPACE_DECL {
13namespace internal {
14
15using ShortBitMask = BitMaskAdaptor<uint16_t, 1>;
16using LargeBitMask = BitMaskAdaptor<uint64_t, 8>;
17
18TEST(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
28TEST(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
40TEST(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
55TEST(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

source code of libc/test/src/__support/HashTable/bitmask_test.cpp