5#include "testing/testing.h"
26 5, 100, 16383, 16384, 16385, 20000, 20001, 50000, 50001, 50002, 100000, 101000};
39 0b0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'1111'0010'0000;
59 EXPECT_FALSE(
mask.contains(0));
60 EXPECT_FALSE(
mask.contains(100));
89 bit_vec[10'000].set();
90 bit_vec[10'002].set();
91 bit_vec[50'000].set();
92 bit_vec[70'000].set();
93 bit_vec[70'002].set();
94 bit_vec[70'004].set();
95 bit_vec[70'005].set();
122 bools[10'000] =
true;
123 bools[10'002] =
true;
124 bools[50'000] =
true;
125 bools[70'000] =
true;
126 bools[70'002] =
true;
127 bools[70'004] =
true;
128 bools[70'005] =
true;
167static BitVector<> build_bits_with_uniform_distribution(
const int bits_num,
168 const int set_bits_num,
169 const uint32_t
seed = 0)
171 if (set_bits_num > bits_num / 2) {
172 BitVector bit_vec = build_bits_with_uniform_distribution(bits_num, bits_num - set_bits_num);
179 while (counter < set_bits_num) {
180 const int i = rng.get_int32(
int(bits_num));
190static void benchmark_uniform_bit_distribution(
const int bits_num,
191 const int set_bits_num,
192 const int iterations)
194 const bool machine_readable =
true;
195 BitVector bit_vec = build_bits_with_uniform_distribution(bits_num, set_bits_num);
196 std::locale loc(
"en_US.UTF-8");
198 for ([[maybe_unused]]
const int64_t i : IndexRange(iterations)) {
199 IndexMaskMemory memory;
206 min_duration = std::min(min_duration, duration);
209 const double ms = double(min_duration.count()) / 1'000'000.0;
210 if (machine_readable) {
211 std::cout << fmt::format(
"{},{:.6}\n", set_bits_num, ms);
214 std::cout << fmt::format(loc,
"{:15L} / {:L}: {:.4} ms\n", set_bits_num, bits_num, ms);
218TEST(index_mask, FromBitsBenchmark)
220 const int size = 100'000'000;
221 const int iterations = 5;
222 Vector<int> set_bit_nums;
225 while (current <
size / 2) {
226 set_bit_nums.
append(current);
228 current = int(current * 1.3);
231 std::sort(set_bit_nums.
begin(), set_bit_nums.
end());
233 for (
const int set_bit_num : set_bit_nums) {
234 benchmark_uniform_bit_distribution(
size, set_bit_num, iterations);
262 index = (index + 1) %
size;
274 IndexRange(1), slice_half_size, 2, slice_half_size, memory),
283 universe,
BitSpan(inverted_bits).slice(slice), memory);
294 bit_vec[200].reset();
295 bit_vec[201].reset();
296 bit_vec[500].reset();
297 bit_vec[502].reset();
298 bit_vec[504].reset();
299 bit_vec[506].reset();
304 EXPECT_FALSE(
mask.contains(5));
305 EXPECT_FALSE(
mask.contains(200));
306 EXPECT_FALSE(
mask.contains(201));
307 EXPECT_FALSE(
mask.contains(500));
308 EXPECT_FALSE(
mask.contains(502));
309 EXPECT_FALSE(
mask.contains(504));
310 EXPECT_FALSE(
mask.contains(506));
412 EXPECT_TRUE(mask_difference.
is_empty());
440 EXPECT_TRUE(mask_intersection.
is_empty());
457 mask.foreach_range([&](
const IndexRange range) { ranges.append(range); });
470 EXPECT_TRUE(
mask.to_range().has_value());
475 EXPECT_TRUE(
mask.to_range().has_value());
480 EXPECT_FALSE(
mask.to_range().has_value());
485 EXPECT_TRUE(
mask.to_range().has_value());
525 const auto test_range = [](
const IndexRange range) {
532 test_range({0, 16384});
533 test_range({16320, 64});
534 test_range({16384, 64});
535 test_range({0, 100000});
536 test_range({100000, 100000});
537 test_range({688064, 64});
571 for ([[maybe_unused]]
const int64_t j :
586 const int64_t new_index =
mask.iterator_to_index(it);
603 for (
const int64_t offset : {0, 1, 2, 100, 500}) {
605 const bool contained = std::binary_search(
indices.begin(),
indices.end(), index_to_search);
606 const std::optional<RawMaskIterator> it =
mask.find(index_to_search);
630 for (
const int index : values) {
631 EXPECT_TRUE(
mask.contains(index));
634 EXPECT_TRUE(values.
contains(
int(index)));
678 const int64_t universe_size = 110;
693 complement.foreach_index([&](
const int64_t i) { EXPECT_FALSE(
mask.contains(
i)); });
694 mask.foreach_index([&](
const int64_t i) { EXPECT_FALSE(complement.contains(
i)); });
702 EXPECT_TRUE(
result.has_value());
734 EXPECT_FALSE(
mask.find_larger_equal(101'000).has_value());
745 EXPECT_FALSE(
mask.find_larger_equal(40'000).has_value());
746 EXPECT_FALSE(
mask.find_larger_equal(40'001).has_value());
747 EXPECT_FALSE(
mask.find_larger_equal(100'000).has_value());
782 EXPECT_FALSE(
mask.find_smaller_equal(0).has_value());
783 EXPECT_FALSE(
mask.find_smaller_equal(1).has_value());
784 EXPECT_FALSE(
mask.find_smaller_equal(50).has_value());
785 EXPECT_FALSE(
mask.find_smaller_equal(9'999).has_value());
816 {4, 5, 100, 1'000, 10'000, 20'000, 25'000, 100'000}, memory);
869 EXPECT_NE(mask_a, mask_b);
893 EXPECT_NE(mask_a, mask_b);
904 EXPECT_NE(mask_a, mask_b);
909 if (a.
size() !=
b.size()) {
928 EXPECT_FALSE(segments.is_empty());
938 EXPECT_FALSE(segments.is_empty());
949 EXPECT_FALSE(segments.is_empty());
962 EXPECT_FALSE(segments.is_empty());
982 EXPECT_FALSE(segments.is_empty());
991 EXPECT_FALSE(segments.is_empty());
1003 EXPECT_FALSE(segments.is_empty());
1022 {{0,
indices.take_front(5)}, {5,
indices.take_front(5)}}, memory);
1049 EXPECT_TRUE(
mask.is_empty());
1139 EXPECT_TRUE(
mask.is_empty());
1177 EXPECT_TRUE(shifted_mask.
is_empty());
1189 const IndexMask shifted_mask =
mask.shift(1000, memory).shift(-1000, memory);
1204 const IndexMask new_mask =
mask.slice_and_shift(5, 5, 1000, memory);
1220 const IndexMask new_mask =
mask.slice_and_shift(1, 0, 100, memory);
1221 EXPECT_TRUE(new_mask.is_empty());
1227 auto test_range = [](
const IndexRange range) {
1232 const std::optional<IndexRange> new_range =
mask.to_range();
1233 EXPECT_TRUE(new_range.has_value());
1262 EXPECT_TRUE(
mask.is_empty());
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
BMesh const char void * data
unsigned long long int uint64_t
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
static unsigned long seed
void append(const T &value)
constexpr int64_t size() const
static constexpr IndexRange from_begin_end(const int64_t begin, const int64_t end)
static constexpr IndexRange from_begin_size(const int64_t begin, const int64_t size)
constexpr bool contains(int64_t value) const
constexpr IndexRange index_range() const
static constexpr IndexRange from_begin_end_inclusive(const int64_t begin, const int64_t last)
IndexRange index_range() const
bool contains(const Key &key) const
void append(const T &value)
static IndexMask from_predicate(const IndexMask &universe, GrainSize grain_size, IndexMaskMemory &memory, Fn &&predicate)
static IndexMask from_every_nth(int64_t n, int64_t indices_num, const int64_t initial_offset, IndexMaskMemory &memory)
IndexMask slice_content(IndexRange range) const
static IndexMask from_bits(BitSpan bits, IndexMaskMemory &memory)
static IndexMask from_repeating(const IndexMask &mask_to_repeat, int64_t repetitions, int64_t stride, int64_t initial_offset, IndexMaskMemory &memory)
static IndexMask from_union(const IndexMask &mask_a, const IndexMask &mask_b, IndexMaskMemory &memory)
static IndexMask from_ranges(OffsetIndices< T > offsets, const IndexMask &mask, IndexMaskMemory &memory)
static IndexMask from_intersection(const IndexMask &mask_a, const IndexMask &mask_b, IndexMaskMemory &memory)
static IndexMask from_indices(Span< T > indices, IndexMaskMemory &memory)
int64_t iterator_to_index(const RawMaskIterator &it) const
static IndexMask from_segments(Span< IndexMaskSegment > segments, IndexMaskMemory &memory)
static IndexMask from_initializers(const Span< Initializer > initializers, IndexMaskMemory &memory)
bool contains(int64_t query_index) const
IndexMask complement(const IndexMask &universe, IndexMaskMemory &memory) const
static IndexMask from_bools(Span< bool > bools, IndexMaskMemory &memory)
void foreach_index(Fn &&fn) const
RawMaskIterator index_to_iterator(int64_t index) const
static void foreach_segment_zipped(Span< IndexMask > masks, FunctionRef< bool(Span< IndexMaskSegment > segments)> fn)
static IndexMask from_difference(const IndexMask &mask_a, const IndexMask &mask_b, IndexMaskMemory &memory)
IndexRange index_range() const
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
void invert(BitSpanT &&data)
TEST(index_mask_expression, Union)
static bool mask_segments_equals(const IndexMaskSegment &a, const IndexMaskSegment &b)
void index_range_to_mask_segments(const IndexRange range, Vector< IndexMaskSegment, N > &r_segments)
static constexpr int64_t max_segment_size
const std::array< int16_t, max_segment_size > & get_static_indices_array()
std::chrono::nanoseconds Nanoseconds
Clock::time_point TimePoint