Skip to content

Commit ba6d557

Browse files
committed
Add bit manip tests
1 parent 26b6f18 commit ba6d557

File tree

2 files changed

+121
-0
lines changed

2 files changed

+121
-0
lines changed

test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ set(XSIMD_TESTS
164164
test_sum.cpp
165165
test_traits.cpp
166166
test_trigonometric.cpp
167+
test_utils_bits.cpp
167168
test_xsimd_api.cpp
168169
test_utils.hpp
169170
)

test/test_utils_bits.cpp

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
/***************************************************************************
2+
* Copyright (c) Johan Mabille, Sylvain Corlay, Wolf Vollprecht and *
3+
* Martin Renou *
4+
* Copyright (c) QuantStack *
5+
* Copyright (c) Serge Guelton *
6+
* *
7+
* Distributed under the terms of the BSD 3-Clause License. *
8+
* *
9+
* The full license is in the file LICENSE, distributed with this software. *
10+
***************************************************************************/
11+
12+
#include "xsimd/utils/bits.hpp"
13+
14+
#include "test_utils.hpp"
15+
16+
TEST_CASE("[utils::make_bit_mask] single bit")
17+
{
18+
CHECK_EQ(xsimd::utils::make_bit_mask<uint8_t>(0), 0x01);
19+
CHECK_EQ(xsimd::utils::make_bit_mask<uint8_t>(7), 0x80);
20+
CHECK_EQ(xsimd::utils::make_bit_mask<uint32_t>(0), 0x01u);
21+
CHECK_EQ(xsimd::utils::make_bit_mask<uint32_t>(31), 0x80000000u);
22+
CHECK_EQ(xsimd::utils::make_bit_mask<int32_t>(0), 0x01);
23+
CHECK_EQ(xsimd::utils::make_bit_mask<int32_t>(16), 0x00010000);
24+
}
25+
26+
TEST_CASE("[utils::make_bit_mask] multiple bits")
27+
{
28+
CHECK_EQ(xsimd::utils::make_bit_mask(0, 1), 0b11);
29+
CHECK_EQ(xsimd::utils::make_bit_mask<uint8_t>(0, 2, 4), 0b00010101);
30+
}
31+
32+
TEST_CASE("[utils::all_bits_set] basic")
33+
{
34+
CHECK(xsimd::utils::all_bits_set<0>(0x01));
35+
CHECK(xsimd::utils::all_bits_set<7>(0x80));
36+
CHECK_FALSE(xsimd::utils::all_bits_set<0>(0x00));
37+
CHECK_FALSE(xsimd::utils::all_bits_set<1>(0x01));
38+
}
39+
40+
TEST_CASE("[utils::all_bits_set] multiple bits")
41+
{
42+
CHECK((xsimd::utils::all_bits_set<0, 1>(0x03)));
43+
CHECK((xsimd::utils::all_bits_set<0, 1>(0xFF)));
44+
CHECK_FALSE((xsimd::utils::all_bits_set<0, 1>(0x01)));
45+
}
46+
47+
TEST_CASE("[utils::set_bit]")
48+
{
49+
CHECK_EQ(xsimd::utils::set_bit<0>(0), 0x01);
50+
CHECK_EQ(xsimd::utils::set_bit<3>(0), 0x08);
51+
// Idempotent: setting an already-set bit
52+
CHECK_EQ(xsimd::utils::set_bit<0>(0x01), 0x01);
53+
// Does not clear other bits
54+
CHECK_EQ(xsimd::utils::set_bit<1>(0b1101), 0b1111);
55+
}
56+
57+
TEST_CASE("[utils::make_low_mask]")
58+
{
59+
CHECK_EQ(xsimd::utils::make_low_mask<uint8_t>(0), 0x00);
60+
CHECK_EQ(xsimd::utils::make_low_mask<uint8_t>(1), 0x01);
61+
CHECK_EQ(xsimd::utils::make_low_mask<uint8_t>(4), 0x0F);
62+
CHECK_EQ(xsimd::utils::make_low_mask<uint8_t>(7), 0x7F);
63+
// Full width
64+
CHECK_EQ(xsimd::utils::make_low_mask<uint8_t>(8), 0xFF);
65+
CHECK_EQ(xsimd::utils::make_low_mask<uint32_t>(32), 0xFFFFFFFFu);
66+
CHECK_EQ(xsimd::utils::make_low_mask<uint64_t>(64), 0xFFFFFFFFFFFFFFFFu);
67+
}
68+
69+
enum class flag : uint32_t
70+
{
71+
A = 0,
72+
B = 1,
73+
C = 4,
74+
D = 31,
75+
};
76+
77+
TEST_CASE("[utils::uint_bitset] default construction")
78+
{
79+
xsimd::utils::uint_bitset<flag, uint32_t> bs;
80+
CHECK_FALSE(bs.bit_is_set<flag::A>());
81+
CHECK_FALSE(bs.bit_is_set<flag::B>());
82+
}
83+
84+
TEST_CASE("[utils::uint_bitset] construction from raw value")
85+
{
86+
xsimd::utils::uint_bitset<flag, uint32_t> bs(0b11);
87+
CHECK(bs.bit_is_set<flag::A>());
88+
CHECK(bs.bit_is_set<flag::B>());
89+
CHECK_FALSE(bs.bit_is_set<flag::C>());
90+
}
91+
92+
TEST_CASE("[utils::uint_bitset] set_bit")
93+
{
94+
xsimd::utils::uint_bitset<flag, uint32_t> bs;
95+
bs.set_bit<flag::A>();
96+
CHECK(bs.bit_is_set<flag::A>());
97+
CHECK_FALSE(bs.bit_is_set<flag::B>());
98+
bs.set_bit<flag::D>();
99+
CHECK(bs.bit_is_set<flag::D>());
100+
}
101+
102+
TEST_CASE("[utils::uint_bitset] all_bits_set")
103+
{
104+
xsimd::utils::uint_bitset<flag, uint32_t> bs(0b11);
105+
CHECK((bs.all_bits_set<flag::A, flag::B>()));
106+
CHECK_FALSE((bs.all_bits_set<flag::A, flag::C>()));
107+
}
108+
109+
TEST_CASE("[utils::uint_bitset] get_range")
110+
{
111+
enum class rk : uint32_t
112+
{
113+
lo = 0,
114+
mid = 4,
115+
hi = 8
116+
};
117+
xsimd::utils::uint_bitset<rk, uint32_t> bs(0b10101011);
118+
CHECK_EQ((bs.get_range<rk::lo, rk::mid>()), 0b1011);
119+
CHECK_EQ((bs.get_range<rk::mid, rk::hi>()), 0b1010);
120+
}

0 commit comments

Comments
 (0)