mcl: Fix bug in non-template mcl::bit::ones
This commit is contained in:
parent
95422b2091
commit
ed9955891f
4 changed files with 44 additions and 2 deletions
2
externals/mcl/CMakeLists.txt
vendored
2
externals/mcl/CMakeLists.txt
vendored
|
@ -1,7 +1,7 @@
|
|||
cmake_minimum_required(VERSION 3.12 FATAL_ERROR)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
project(mcl LANGUAGES CXX VERSION 0.1.4)
|
||||
project(mcl LANGUAGES CXX VERSION 0.1.5)
|
||||
|
||||
# Project options
|
||||
option(MCL_WARNINGS_AS_ERRORS "Warnings as errors" ON)
|
||||
|
|
2
externals/mcl/include/mcl/bit/bit_field.hpp
vendored
2
externals/mcl/include/mcl/bit/bit_field.hpp
vendored
|
@ -31,7 +31,7 @@ constexpr T ones(size_t count) {
|
|||
if (count == 0) {
|
||||
return 0;
|
||||
}
|
||||
return ~static_cast<T>(0) >> (bitsizeof<T> - count);
|
||||
return static_cast<T>(~static_cast<T>(0)) >> (bitsizeof<T> - count);
|
||||
}
|
||||
|
||||
/// Create a mask of type T for bits [begin_bit, end_bit] inclusive.
|
||||
|
|
1
externals/mcl/tests/CMakeLists.txt
vendored
1
externals/mcl/tests/CMakeLists.txt
vendored
|
@ -1,4 +1,5 @@
|
|||
add_executable(mcl-tests
|
||||
bit/bit_field_tests.cpp
|
||||
main.cpp
|
||||
mp/metavalue_tests.cpp
|
||||
mp/typelist_tests.cpp
|
||||
|
|
41
externals/mcl/tests/bit/bit_field_tests.cpp
vendored
Normal file
41
externals/mcl/tests/bit/bit_field_tests.cpp
vendored
Normal file
|
@ -0,0 +1,41 @@
|
|||
// This file is part of the mcl project.
|
||||
// Copyright (c) 2022 merryhime
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include <array>
|
||||
#include <tuple>
|
||||
|
||||
#include <catch2/catch.hpp>
|
||||
#include <mcl/bit/bit_field.hpp>
|
||||
#include <mcl/stdint.hpp>
|
||||
|
||||
TEST_CASE("mcl::bit::ones", "[bit]") {
|
||||
const std::array cases{
|
||||
std::make_tuple<size_t, u8>(0, 0x00),
|
||||
std::make_tuple<size_t, u8>(1, 0x01),
|
||||
std::make_tuple<size_t, u8>(2, 0x03),
|
||||
std::make_tuple<size_t, u8>(3, 0x07),
|
||||
std::make_tuple<size_t, u8>(4, 0x0f),
|
||||
std::make_tuple<size_t, u8>(5, 0x1f),
|
||||
std::make_tuple<size_t, u8>(6, 0x3f),
|
||||
std::make_tuple<size_t, u8>(7, 0x7f),
|
||||
std::make_tuple<size_t, u8>(8, 0xff),
|
||||
};
|
||||
|
||||
for (const auto [count, expected] : cases) {
|
||||
REQUIRE(mcl::bit::ones<u8>(count) == expected);
|
||||
REQUIRE(mcl::bit::ones<u16>(count) == expected);
|
||||
REQUIRE(mcl::bit::ones<u32>(count) == expected);
|
||||
REQUIRE(mcl::bit::ones<u64>(count) == expected);
|
||||
REQUIRE(mcl::bit::ones<uptr>(count) == expected);
|
||||
REQUIRE(mcl::bit::ones<size_t>(count) == expected);
|
||||
}
|
||||
}
|
||||
|
||||
static_assert(mcl::bit::ones<3, u8>() == 0x7);
|
||||
static_assert(mcl::bit::ones<15, u16>() == 0x7fff);
|
||||
static_assert(mcl::bit::ones<16, u16>() == 0xffff);
|
||||
static_assert(mcl::bit::ones<31, u32>() == 0x7fff'ffff);
|
||||
static_assert(mcl::bit::ones<32, u32>() == 0xffff'ffff);
|
||||
static_assert(mcl::bit::ones<63, u64>() == 0x7fff'ffff'ffff'ffff);
|
||||
static_assert(mcl::bit::ones<64, u64>() == 0xffff'ffff'ffff'ffff);
|
Loading…
Reference in a new issue