/ externals / mcl / tests / bit / bit_field_tests.cpp
bit_field_tests.cpp
 1  // This file is part of the mcl project.
 2  // Copyright (c) 2022 merryhime
 3  // SPDX-License-Identifier: MIT
 4  
 5  #include <array>
 6  #include <tuple>
 7  
 8  #include <catch2/catch_test_macros.hpp>
 9  #include <mcl/bit/bit_field.hpp>
10  #include <mcl/stdint.hpp>
11  
12  TEST_CASE("mcl::bit::ones", "[bit]")
13  {
14      const std::array cases{
15          std::make_tuple<size_t, u8>(0, 0x00),
16          std::make_tuple<size_t, u8>(1, 0x01),
17          std::make_tuple<size_t, u8>(2, 0x03),
18          std::make_tuple<size_t, u8>(3, 0x07),
19          std::make_tuple<size_t, u8>(4, 0x0f),
20          std::make_tuple<size_t, u8>(5, 0x1f),
21          std::make_tuple<size_t, u8>(6, 0x3f),
22          std::make_tuple<size_t, u8>(7, 0x7f),
23          std::make_tuple<size_t, u8>(8, 0xff),
24      };
25  
26      for (const auto [count, expected] : cases) {
27          REQUIRE(mcl::bit::ones<u8>(count) == expected);
28          REQUIRE(mcl::bit::ones<u16>(count) == expected);
29          REQUIRE(mcl::bit::ones<u32>(count) == expected);
30          REQUIRE(mcl::bit::ones<u64>(count) == expected);
31          REQUIRE(mcl::bit::ones<uptr>(count) == expected);
32          REQUIRE(mcl::bit::ones<size_t>(count) == expected);
33      }
34  }
35  
36  static_assert(mcl::bit::ones<3, u8>() == 0x7);
37  static_assert(mcl::bit::ones<15, u16>() == 0x7fff);
38  static_assert(mcl::bit::ones<16, u16>() == 0xffff);
39  static_assert(mcl::bit::ones<31, u32>() == 0x7fff'ffff);
40  static_assert(mcl::bit::ones<32, u32>() == 0xffff'ffff);
41  static_assert(mcl::bit::ones<63, u64>() == 0x7fff'ffff'ffff'ffff);
42  static_assert(mcl::bit::ones<64, u64>() == 0xffff'ffff'ffff'ffff);