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); });
329 [](
const BitInt a,
const BitInt b) {
return a ^
b; }, vec_a, vec_b),
364 EXPECT_TRUE(bits[0]);
365 EXPECT_FALSE(bits[1]);
366 EXPECT_TRUE(bits[2]);
367 EXPECT_FALSE(bits[3]);
368 EXPECT_FALSE(bits[4]);
375 EXPECT_FALSE(bits[99]);
376 EXPECT_TRUE(bits[100]);
377 EXPECT_TRUE(bits[101]);
378 EXPECT_TRUE(bits[199]);
379 EXPECT_FALSE(bits[200]);
383TEST(bit_span, to_index_ranges_small)
401TEST(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
void append(const bool value)
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)
std::optional< int64_t > find_first_1_index_expr(ExprFn &&Expr, const FirstBitSpanT &first_arg, const BitSpanT &...args)
static constexpr int64_t BitsPerInt
void bits_to_index_ranges(const BitSpan bits, IndexRangesBuilder< IntT > &builder)
bool is_bounded_span(const BitSpan span)
std::optional< int64_t > find_first_0_index(const BitSpanT &data)
void foreach_1_index(const BitSpanT &data, Fn &&fn)
std::optional< int64_t > find_first_1_index(const BitSpanT &data)
unsigned __int64 uint64_t