Skip to content

Commit 344a254

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

File tree

2 files changed

+123
-0
lines changed

2 files changed

+123
-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: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
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 <cstdint>
13+
14+
#include <doctest/doctest.h>
15+
16+
#include "xsimd/utils/bits.hpp"
17+
18+
TEST_CASE("[utils::make_bit_mask] single bit")
19+
{
20+
CHECK_EQ(xsimd::utils::make_bit_mask<std::uint8_t>(0), 0x01);
21+
CHECK_EQ(xsimd::utils::make_bit_mask<std::uint8_t>(7), 0x80);
22+
CHECK_EQ(xsimd::utils::make_bit_mask<std::uint32_t>(0), 0x01u);
23+
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);
26+
}
27+
28+
TEST_CASE("[utils::make_bit_mask] multiple bits")
29+
{
30+
CHECK_EQ(xsimd::utils::make_bit_mask(0, 1), 0b11);
31+
CHECK_EQ(xsimd::utils::make_bit_mask<std::uint8_t>(0, 2, 4), 0b00010101);
32+
}
33+
34+
TEST_CASE("[utils::all_bits_set] basic")
35+
{
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));
40+
}
41+
42+
TEST_CASE("[utils::all_bits_set] multiple bits")
43+
{
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)));
47+
}
48+
49+
TEST_CASE("[utils::set_bit]")
50+
{
51+
CHECK_EQ(xsimd::utils::set_bit<0>(0), 0x01);
52+
CHECK_EQ(xsimd::utils::set_bit<3>(0), 0x08);
53+
// Idempotent: setting an already-set bit
54+
CHECK_EQ(xsimd::utils::set_bit<0>(0x01), 0x01);
55+
// Does not clear other bits
56+
CHECK_EQ(xsimd::utils::set_bit<1>(0b1101), 0b1111);
57+
}
58+
59+
TEST_CASE("[utils::make_low_mask]")
60+
{
61+
CHECK_EQ(xsimd::utils::make_low_mask<std::uint8_t>(0), 0x00);
62+
CHECK_EQ(xsimd::utils::make_low_mask<std::uint8_t>(1), 0x01);
63+
CHECK_EQ(xsimd::utils::make_low_mask<std::uint8_t>(4), 0x0F);
64+
CHECK_EQ(xsimd::utils::make_low_mask<std::uint8_t>(7), 0x7F);
65+
// Full width
66+
CHECK_EQ(xsimd::utils::make_low_mask<std::uint8_t>(8), 0xFF);
67+
CHECK_EQ(xsimd::utils::make_low_mask<std::uint32_t>(32), 0xFFFFFFFFu);
68+
CHECK_EQ(xsimd::utils::make_low_mask<std::uint64_t>(64), 0xFFFFFFFFFFFFFFFFu);
69+
}
70+
71+
enum class flag : std::uint32_t
72+
{
73+
A = 0,
74+
B = 1,
75+
C = 4,
76+
D = 31,
77+
};
78+
79+
TEST_CASE("[utils::uint_bitset] default construction")
80+
{
81+
xsimd::utils::uint_bitset<flag, std::uint32_t> bs;
82+
CHECK_FALSE(bs.bit_is_set<flag::A>());
83+
CHECK_FALSE(bs.bit_is_set<flag::B>());
84+
}
85+
86+
TEST_CASE("[utils::uint_bitset] construction from raw value")
87+
{
88+
xsimd::utils::uint_bitset<flag, std::uint32_t> bs(0b11);
89+
CHECK(bs.bit_is_set<flag::A>());
90+
CHECK(bs.bit_is_set<flag::B>());
91+
CHECK_FALSE(bs.bit_is_set<flag::C>());
92+
}
93+
94+
TEST_CASE("[utils::uint_bitset] set_bit")
95+
{
96+
xsimd::utils::uint_bitset<flag, std::uint32_t> bs;
97+
bs.set_bit<flag::A>();
98+
CHECK(bs.bit_is_set<flag::A>());
99+
CHECK_FALSE(bs.bit_is_set<flag::B>());
100+
bs.set_bit<flag::D>();
101+
CHECK(bs.bit_is_set<flag::D>());
102+
}
103+
104+
TEST_CASE("[utils::uint_bitset] all_bits_set")
105+
{
106+
xsimd::utils::uint_bitset<flag, std::uint32_t> bs(0b11);
107+
CHECK((bs.all_bits_set<flag::A, flag::B>()));
108+
CHECK_FALSE((bs.all_bits_set<flag::A, flag::C>()));
109+
}
110+
111+
TEST_CASE("[utils::uint_bitset] get_range")
112+
{
113+
enum class rk : std::uint32_t
114+
{
115+
lo = 0,
116+
mid = 4,
117+
hi = 8
118+
};
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);
122+
}

0 commit comments

Comments
 (0)