BLI: refactor IndexMask for better performance and memory usage #104629

Merged
Jacques Lucke merged 254 commits from JacquesLucke/blender:index-mask-refactor into main 2023-05-24 18:11:47 +02:00
2 changed files with 12 additions and 2 deletions
Showing only changes of commit 8d377aff1b - Show all commits

View File

@ -499,7 +499,8 @@ inline IndexMask::IndexMask(const IndexRange range)
init_empty_mask(data_);
return;
}
*this = get_static_index_mask_for_min_size(range.one_after_last());
const int64_t one_after_last = range.one_after_last();
*this = get_static_index_mask_for_min_size(one_after_last);
const int64_t first_chunk_id = index_to_chunk_id(range.first());
const int64_t last_chunk_id = index_to_chunk_id(range.last());
@ -512,7 +513,9 @@ inline IndexMask::IndexMask(const IndexRange range)
data_.begin_it.segment_i = 0;
data_.begin_it.index_in_segment = range.first() & chunk_mask_low;
data_.end_it.segment_i = 0;
data_.end_it.index_in_segment = range.one_after_last() & chunk_mask_low;
data_.end_it.index_in_segment = (one_after_last == chunk_capacity) ?
chunk_capacity :
range.one_after_last() & chunk_mask_low;
}
inline int64_t IndexMask::size() const

View File

@ -218,4 +218,11 @@ TEST(index_mask, ToRange)
}
}
TEST(index_mask, FromRange)
{
const IndexRange range(16320, 64);
const IndexMask mask = range;
EXPECT_EQ(mask.to_range(), range);
}
} // namespace blender::index_mask::tests