Blender V4.3
BLI_bit_ref_test.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#include <array>
6
7#include "BLI_bit_ref.hh"
8
9#include "testing/testing.h"
10
11namespace blender::bits::tests {
12
13TEST(bit_ref, MaskFirstNBits)
14{
17 0b0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0001);
19 0b0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0001'1111);
21 0b0111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111);
23 0b1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111);
24}
25
26TEST(bit_ref, MaskLastNBits)
27{
29 0b0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000);
31 0b1000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000);
33 0b1111'1000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000);
35 0b1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1110);
37 0b1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111);
38}
39
40TEST(bit_ref, MaskSingleBit)
41{
44 0b0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0010);
46 0b0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0010'0000);
48 0b1000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000);
49}
50
51TEST(bit_ref, IntContainingBit)
52{
53 std::array<uint64_t, 5> array;
54 uint64_t *data = array.data();
55 EXPECT_EQ(int_containing_bit(data, 0), data);
56 EXPECT_EQ(int_containing_bit(data, 1), data);
57 EXPECT_EQ(int_containing_bit(data, 63), data);
58 EXPECT_EQ(int_containing_bit(data, 64), data + 1);
59 EXPECT_EQ(int_containing_bit(data, 65), data + 1);
60 EXPECT_EQ(int_containing_bit(data, 100), data + 1);
61 EXPECT_EQ(int_containing_bit(data, 127), data + 1);
62 EXPECT_EQ(int_containing_bit(data, 128), data + 2);
63 const uint64_t *data_const = data;
64 EXPECT_EQ(int_containing_bit(data_const, 0), data_const);
65 EXPECT_EQ(int_containing_bit(data_const, 1), data_const);
66 EXPECT_EQ(int_containing_bit(data_const, 63), data_const);
67 EXPECT_EQ(int_containing_bit(data_const, 64), data_const + 1);
68 EXPECT_EQ(int_containing_bit(data_const, 65), data_const + 1);
69 EXPECT_EQ(int_containing_bit(data_const, 100), data_const + 1);
70 EXPECT_EQ(int_containing_bit(data_const, 127), data_const + 1);
71 EXPECT_EQ(int_containing_bit(data_const, 128), data_const + 2);
72}
73
74TEST(bit_ref, Test)
75{
76 uint64_t data = (1 << 3) | (1 << 7);
77 EXPECT_FALSE(BitRef(&data, 0).test());
78 EXPECT_FALSE(BitRef(&data, 1).test());
79 EXPECT_FALSE(BitRef(&data, 2).test());
80 EXPECT_TRUE(BitRef(&data, 3).test());
81 EXPECT_FALSE(BitRef(&data, 4));
82 EXPECT_FALSE(BitRef(&data, 5));
83 EXPECT_FALSE(BitRef(&data, 6));
84 EXPECT_TRUE(BitRef(&data, 7));
85
86 EXPECT_FALSE(MutableBitRef(&data, 0).test());
87 EXPECT_FALSE(MutableBitRef(&data, 1).test());
88 EXPECT_FALSE(MutableBitRef(&data, 2).test());
89 EXPECT_TRUE(MutableBitRef(&data, 3).test());
90 EXPECT_FALSE(MutableBitRef(&data, 4));
91 EXPECT_FALSE(MutableBitRef(&data, 5));
92 EXPECT_FALSE(MutableBitRef(&data, 6));
93 EXPECT_TRUE(MutableBitRef(&data, 7));
94}
95
96TEST(bit_ref, Set)
97{
98 uint64_t data = 0;
99 MutableBitRef(&data, 0).set();
100 MutableBitRef(&data, 1).set();
101 MutableBitRef(&data, 1).set();
102 MutableBitRef(&data, 4).set();
103 EXPECT_EQ(data, (1 << 0) | (1 << 1) | (1 << 4));
104 MutableBitRef(&data, 5).set(true);
105 MutableBitRef(&data, 1).set(false);
106 EXPECT_EQ(data, (1 << 0) | (1 << 4) | (1 << 5));
107}
108
109TEST(bit_ref, Reset)
110{
111 uint64_t data = -1;
112 MutableBitRef(&data, 0).reset();
113 MutableBitRef(&data, 2).reset();
114 EXPECT_EQ(data, uint64_t(-1) & ~(1 << 0) & ~(1 << 2));
115}
116
117TEST(bit_ref, SetBranchless)
118{
119 uint64_t data = 0;
120 MutableBitRef(&data, 0).set_branchless(true);
121 EXPECT_EQ(data, 1);
122 MutableBitRef(&data, 0).set_branchless(false);
123 EXPECT_EQ(data, 0);
124 MutableBitRef(&data, 3).set_branchless(false);
125 MutableBitRef(&data, 4).set_branchless(true);
126 EXPECT_EQ(data, 16);
127 MutableBitRef(&data, 3).set_branchless(true);
128 MutableBitRef(&data, 4).set_branchless(true);
129 EXPECT_EQ(data, 24);
130}
131
132TEST(bit_ref, Cast)
133{
134 uint64_t data = 0;
135 MutableBitRef mutable_ref(&data, 3);
136 BitRef ref = mutable_ref;
137 EXPECT_FALSE(ref);
138 mutable_ref.set();
139 EXPECT_TRUE(ref);
140}
141
142TEST(bit_ref, MaskRangeBits)
143{
145 0b0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000);
147 0b0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0001);
149 0b0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0001'1111);
151 0b0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000);
153 0b1000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000);
155 0b1111'1000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000);
157 0b0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0111'0000'0000);
159 0b1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111);
160}
161
162} // namespace blender::bits::tests
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
void set_branchless(const bool value)
TEST(bit_group_vector, DefaultConstruct)
BitInt * int_containing_bit(BitInt *data, const int64_t bit_index)
BitInt mask_single_bit(const int64_t bit_index)
BitInt mask_last_n_bits(const int64_t n)
BitInt mask_first_n_bits(const int64_t n)
BitInt mask_range_bits(const int64_t start, const int64_t size)
unsigned __int64 uint64_t
Definition stdint.h:90