Skip to content

Commit 74e0044

Browse files
committed
Restrict bit manip to unsigned types
1 parent 69c1d35 commit 74e0044

File tree

2 files changed

+24
-21
lines changed

2 files changed

+24
-21
lines changed

include/xsimd/utils/bits.hpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,16 @@
1313
#define XSIMD_CPUID_UTILS_HPP
1414

1515
#include <cassert>
16+
#include <type_traits>
17+
1618
namespace xsimd
1719
{
1820
namespace utils
1921
{
2022
template <typename I>
2123
constexpr I make_bit_mask(I bit)
2224
{
23-
assert(bit >= 0);
25+
static_assert(std::is_unsigned<I>::value);
2426
assert(bit < static_cast<I>(8 * sizeof(I)));
2527
return static_cast<I>(I { 1 } << bit);
2628
}
@@ -29,19 +31,22 @@ namespace xsimd
2931
constexpr I make_bit_mask(I bit, Args... bits)
3032
{
3133
// TODO(C++17): Use fold expression
34+
static_assert(std::is_unsigned<I>::value);
3235
return make_bit_mask<I>(bit) | make_bit_mask<I>(static_cast<I>(bits)...);
3336
}
3437

3538
template <int... Bits, typename I>
3639
constexpr bool all_bits_set(I value)
3740
{
41+
static_assert(std::is_unsigned<I>::value);
3842
constexpr I mask = make_bit_mask<I>(static_cast<I>(Bits)...);
3943
return (value & mask) == mask;
4044
}
4145

4246
template <int Bit, typename I>
4347
constexpr I set_bit(I value)
4448
{
49+
static_assert(std::is_unsigned<I>::value);
4550
constexpr I mask = make_bit_mask<I>(static_cast<I>(Bit));
4651
return value | mask;
4752
}
@@ -52,7 +57,7 @@ namespace xsimd
5257
template <typename I>
5358
constexpr I make_low_mask(I width) noexcept
5459
{
55-
assert(width >= 0);
60+
static_assert(std::is_unsigned<I>::value);
5661
assert(width <= static_cast<I>(8 * sizeof(I)));
5762
if (width == static_cast<I>(8 * sizeof(I)))
5863
{

test/test_utils_bits.cpp

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -21,39 +21,37 @@ TEST_CASE("[utils::make_bit_mask] single bit")
2121
CHECK_EQ(xsimd::utils::make_bit_mask<std::uint8_t>(7), 0x80);
2222
CHECK_EQ(xsimd::utils::make_bit_mask<std::uint32_t>(0), 0x01u);
2323
CHECK_EQ(xsimd::utils::make_bit_mask<std::uint32_t>(31), 0x80000000u);
24-
CHECK_EQ(xsimd::utils::make_bit_mask<std::int32_t>(0), 0x01);
25-
CHECK_EQ(xsimd::utils::make_bit_mask<std::int32_t>(16), 0x00010000);
2624
}
2725

2826
TEST_CASE("[utils::make_bit_mask] multiple bits")
2927
{
30-
CHECK_EQ(xsimd::utils::make_bit_mask(0, 1), 0b11);
28+
CHECK_EQ(xsimd::utils::make_bit_mask(0u, 1u), 0b11);
3129
CHECK_EQ(xsimd::utils::make_bit_mask<std::uint8_t>(0, 2, 4), 0b00010101);
3230
}
3331

3432
TEST_CASE("[utils::all_bits_set] basic")
3533
{
36-
CHECK(xsimd::utils::all_bits_set<0>(0x01));
37-
CHECK(xsimd::utils::all_bits_set<7>(0x80));
38-
CHECK_FALSE(xsimd::utils::all_bits_set<0>(0x00));
39-
CHECK_FALSE(xsimd::utils::all_bits_set<1>(0x01));
34+
CHECK(xsimd::utils::all_bits_set<0>(0x01u));
35+
CHECK(xsimd::utils::all_bits_set<7>(0x80u));
36+
CHECK_FALSE(xsimd::utils::all_bits_set<0>(0x00u));
37+
CHECK_FALSE(xsimd::utils::all_bits_set<1>(0x01u));
4038
}
4139

4240
TEST_CASE("[utils::all_bits_set] multiple bits")
4341
{
44-
CHECK((xsimd::utils::all_bits_set<0, 1>(0x03)));
45-
CHECK((xsimd::utils::all_bits_set<0, 1>(0xFF)));
46-
CHECK_FALSE((xsimd::utils::all_bits_set<0, 1>(0x01)));
42+
CHECK((xsimd::utils::all_bits_set<0, 1>(0x03u)));
43+
CHECK((xsimd::utils::all_bits_set<0, 1>(0xFFu)));
44+
CHECK_FALSE((xsimd::utils::all_bits_set<0, 1>(0x01u)));
4745
}
4846

4947
TEST_CASE("[utils::set_bit]")
5048
{
51-
CHECK_EQ(xsimd::utils::set_bit<0>(0), 0x01);
52-
CHECK_EQ(xsimd::utils::set_bit<3>(0), 0x08);
49+
CHECK_EQ(xsimd::utils::set_bit<0>(0u), 0x01u);
50+
CHECK_EQ(xsimd::utils::set_bit<3>(0u), 0x08u);
5351
// Idempotent: setting an already-set bit
54-
CHECK_EQ(xsimd::utils::set_bit<0>(0x01), 0x01);
52+
CHECK_EQ(xsimd::utils::set_bit<0>(0x01u), 0x01u);
5553
// Does not clear other bits
56-
CHECK_EQ(xsimd::utils::set_bit<1>(0b1101), 0b1111);
54+
CHECK_EQ(xsimd::utils::set_bit<1>(0b1101u), 0b1111u);
5755
}
5856

5957
TEST_CASE("[utils::make_low_mask]")
@@ -85,7 +83,7 @@ TEST_CASE("[utils::uint_bitset] default construction")
8583

8684
TEST_CASE("[utils::uint_bitset] construction from raw value")
8785
{
88-
xsimd::utils::uint_bitset<flag, std::uint32_t> bs(0b11);
86+
xsimd::utils::uint_bitset<flag, std::uint32_t> bs(0b11u);
8987
CHECK(bs.bit_is_set<flag::A>());
9088
CHECK(bs.bit_is_set<flag::B>());
9189
CHECK_FALSE(bs.bit_is_set<flag::C>());
@@ -103,7 +101,7 @@ TEST_CASE("[utils::uint_bitset] set_bit")
103101

104102
TEST_CASE("[utils::uint_bitset] all_bits_set")
105103
{
106-
xsimd::utils::uint_bitset<flag, std::uint32_t> bs(0b11);
104+
xsimd::utils::uint_bitset<flag, std::uint32_t> bs(0b11u);
107105
CHECK((bs.all_bits_set<flag::A, flag::B>()));
108106
CHECK_FALSE((bs.all_bits_set<flag::A, flag::C>()));
109107
}
@@ -116,7 +114,7 @@ TEST_CASE("[utils::uint_bitset] get_range")
116114
mid = 4,
117115
hi = 8
118116
};
119-
xsimd::utils::uint_bitset<rk, std::uint32_t> bs(0b10101011);
120-
CHECK_EQ((bs.get_range<rk::lo, rk::mid>()), 0b1011);
121-
CHECK_EQ((bs.get_range<rk::mid, rk::hi>()), 0b1010);
117+
xsimd::utils::uint_bitset<rk, std::uint32_t> bs(0b10101011u);
118+
CHECK_EQ((bs.get_range<rk::lo, rk::mid>()), 0b1011u);
119+
CHECK_EQ((bs.get_range<rk::mid, rk::hi>()), 0b1010u);
122120
}

0 commit comments

Comments
 (0)