brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.0 KiB · ce56b20 Raw
71 lines · cpp
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-exception6//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 internal70} // namespace LIBC_NAMESPACE_DECL71