diff --git a/externals/mcl/CMakeLists.txt b/externals/mcl/CMakeLists.txt index 49327646..5b0cfa29 100644 --- a/externals/mcl/CMakeLists.txt +++ b/externals/mcl/CMakeLists.txt @@ -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) diff --git a/externals/mcl/include/mcl/bit/bit_field.hpp b/externals/mcl/include/mcl/bit/bit_field.hpp index 71d8b4a8..c09eda0a 100644 --- a/externals/mcl/include/mcl/bit/bit_field.hpp +++ b/externals/mcl/include/mcl/bit/bit_field.hpp @@ -31,7 +31,7 @@ constexpr T ones(size_t count) { if (count == 0) { return 0; } - return ~static_cast(0) >> (bitsizeof - count); + return static_cast(~static_cast(0)) >> (bitsizeof - count); } /// Create a mask of type T for bits [begin_bit, end_bit] inclusive. diff --git a/externals/mcl/tests/CMakeLists.txt b/externals/mcl/tests/CMakeLists.txt index 1b60518d..1619f34c 100644 --- a/externals/mcl/tests/CMakeLists.txt +++ b/externals/mcl/tests/CMakeLists.txt @@ -1,4 +1,5 @@ add_executable(mcl-tests + bit/bit_field_tests.cpp main.cpp mp/metavalue_tests.cpp mp/typelist_tests.cpp diff --git a/externals/mcl/tests/bit/bit_field_tests.cpp b/externals/mcl/tests/bit/bit_field_tests.cpp new file mode 100644 index 00000000..fba31eb5 --- /dev/null +++ b/externals/mcl/tests/bit/bit_field_tests.cpp @@ -0,0 +1,41 @@ +// This file is part of the mcl project. +// Copyright (c) 2022 merryhime +// SPDX-License-Identifier: MIT + +#include +#include + +#include +#include +#include + +TEST_CASE("mcl::bit::ones", "[bit]") { + const std::array cases{ + std::make_tuple(0, 0x00), + std::make_tuple(1, 0x01), + std::make_tuple(2, 0x03), + std::make_tuple(3, 0x07), + std::make_tuple(4, 0x0f), + std::make_tuple(5, 0x1f), + std::make_tuple(6, 0x3f), + std::make_tuple(7, 0x7f), + std::make_tuple(8, 0xff), + }; + + for (const auto [count, expected] : cases) { + REQUIRE(mcl::bit::ones(count) == expected); + REQUIRE(mcl::bit::ones(count) == expected); + REQUIRE(mcl::bit::ones(count) == expected); + REQUIRE(mcl::bit::ones(count) == expected); + REQUIRE(mcl::bit::ones(count) == expected); + REQUIRE(mcl::bit::ones(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);