14#include "testing/testing.h"
18TEST(bit_span, DefaultConstructor)
22 memset(buffer, 0xff,
sizeof(
BitSpan));
42 for (
const BitRef bit : span) {
48TEST(bit_span, MutableIteration)
55 bit.set(index % 4 == 0);
59 0b0000'0000'0000'0000'0000'0000'0001'0001'0001'0001'0001'0001'0001'0001'0001'0001);
62TEST(bit_span, SubscriptOperator)
73 EXPECT_FALSE(mutable_span[5].test());
74 EXPECT_FALSE(span[5].test());
75 mutable_span[5].set(
true);
76 EXPECT_TRUE(mutable_span[5].test());
77 EXPECT_TRUE(span[5].test());
79 EXPECT_FALSE(mutable_span[120].test());
80 EXPECT_FALSE(span[120].test());
81 mutable_span[120].set(
true);
82 EXPECT_TRUE(mutable_span[120].test());
83 EXPECT_TRUE(span[120].test());
86 0b0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0010'0000);
88 0b0000'0001'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000);
91TEST(bit_span, RangeConstructor)
97 EXPECT_FALSE(mutable_span[1].test());
98 EXPECT_FALSE(span[1].test());
99 mutable_span[0].set(
true);
100 mutable_span[1].set(
true);
101 mutable_span[2].set(
true);
102 mutable_span[0].set(
false);
103 mutable_span[2].set(
false);
104 EXPECT_TRUE(mutable_span[1].test());
105 EXPECT_TRUE(span[1].test());
108 0b0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0010'0000);
121 0b0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'1111'1111'0000);
125 0b0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'1111'0000);
136 std::array<uint64_t, 10>
data;
137 memset(data.data(), 0,
sizeof(data));
145 span.slice(
IndexRange(10, 190)).set_all(
false);
148 EXPECT_EQ(span[i], (i >= 5 && i < 10) || (i >= 200 && i < 505));
154 std::array<uint64_t, 10>
data;
181 std::array<uint64_t, 30> src_data;
189 std::array<uint64_t, 4> dst_data;
195 EXPECT_TRUE(dst[i].test() == src[401 + i].test());
201 std::array<uint64_t, 100> data_1;
204 span_1[i].set(i % 2 == 0);
207 std::array<uint64_t, 100> data_2;
210 span_2[i].set(i % 2 != 0);
215 EXPECT_TRUE(span_1[i].test());
221 std::array<uint64_t, 100> data_1{};
224 span_1[i].set(i % 2 == 0);
227 std::array<uint64_t, 100> data_2{};
230 span_2[i].set(i % 2 != 0);
235 EXPECT_FALSE(span_1[i].test());
241 std::array<uint64_t, 2> data{};
243 for (
const int i : {1, 28, 37, 86}) {
248 foreach_1_index(span.
slice({4, span.size() - 4}), [&](
const int i) { indices_test.append(i); });
261 EXPECT_TRUE(bits[0]);
262 EXPECT_FALSE(bits[1]);
263 EXPECT_TRUE(bits[2]);
264 EXPECT_FALSE(bits[3]);
265 EXPECT_FALSE(bits[4]);
272 EXPECT_FALSE(bits[99]);
273 EXPECT_TRUE(bits[100]);
274 EXPECT_TRUE(bits[101]);
275 EXPECT_TRUE(bits[199]);
276 EXPECT_FALSE(bits[200]);
280TEST(bit_span, to_index_ranges_small)
298TEST(bit_span, to_index_ranges_all_ones)
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
static constexpr IndexRange from_begin_size(const int64_t begin, const int64_t size)
static constexpr IndexRange from_begin_end_inclusive(const int64_t begin, const int64_t last)
Span< T > as_span() const
const BitInt * data() const
BitSpan slice(const IndexRange range) const
const IndexRange & bit_range() const
MutableBitSpan slice(const IndexRange range) const
const IndexRange & bit_range() const
IndexRange index_range() const
void copy_from(const BitSpan other)
TEST(bit_group_vector, DefaultConstruct)
bool or_bools_into_bits(Span< bool > bools, MutableBitSpan r_bits, int64_t allowed_overshoot=0)
static constexpr int64_t BitsPerInt
void bits_to_index_ranges(const BitSpan bits, IndexRangesBuilder< IntT > &builder)
bool is_bounded_span(const BitSpan span)
void foreach_1_index(const BitSpanT &data, Fn &&fn)
unsigned __int64 uint64_t