From 0d66f3ae0db109f7854767a188c4574e101e893d Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Wed, 6 Apr 2022 15:47:58 +0200 Subject: progress --- .../blender/blenlib/BLI_generic_virtual_array.hh | 44 ++++++++++++++++++++++ .../blenlib/intern/generic_virtual_array.cc | 26 +++++++++++++ 2 files changed, 70 insertions(+) (limited to 'source') diff --git a/source/blender/blenlib/BLI_generic_virtual_array.hh b/source/blender/blenlib/BLI_generic_virtual_array.hh index cb1a984c8ce..6325a9e4d21 100644 --- a/source/blender/blenlib/BLI_generic_virtual_array.hh +++ b/source/blender/blenlib/BLI_generic_virtual_array.hh @@ -136,6 +136,9 @@ class GVArrayCommon { void materialize_to_uninitialized(void *dst) const; void materialize_to_uninitialized(const IndexMask mask, void *dst) const; + void materialize_compressed(IndexMask mask, void *dst) const; + void materialize_compressed_to_uninitialized(IndexMask mask, void *dst) const; + /** * Returns true when the virtual array is stored as a span internally. */ @@ -339,6 +342,16 @@ template class GVArrayImpl_For_VArray : public GVArrayImpl { varray_.materialize_to_uninitialized(mask, MutableSpan((T *)dst, mask.min_array_size())); } + void materialize_compressed(const IndexMask mask, void *dst) const override + { + varray_.materialize_compressed(mask, MutableSpan((T *)dst, mask.size())); + } + + void materialize_compressed_to_uninitialized(const IndexMask mask, void *dst) const override + { + varray_.materialize_compressed_to_uninitialized(mask, MutableSpan((T *)dst, mask.size())); + } + bool try_assign_VArray(void *varray) const override { *(VArray *)varray = varray_; @@ -403,6 +416,27 @@ template class VArrayImpl_For_GVArray : public VArrayImpl { { return varray_.may_have_ownership(); } + + void materialize(IndexMask mask, MutableSpan r_span) const override + { + varray_.materialize(mask, r_span.data()); + } + + void materialize_to_uninitialized(IndexMask mask, MutableSpan r_span) const override + { + varray_.materialize_to_uninitialized(mask, r_span.data()); + } + + void materialize_compressed(IndexMask mask, MutableSpan r_span) const override + { + varray_.materialize_compressed(mask, r_span.data()); + } + + void materialize_compressed_to_uninitialized(IndexMask mask, + MutableSpan r_span) const override + { + varray_.materialize_compressed_to_uninitialized(mask, r_span.data()); + } }; /* Used to convert any typed virtual mutable array into a generic one. */ @@ -482,6 +516,16 @@ template class GVMutableArrayImpl_For_VMutableArray : public GVMutab varray_.materialize_to_uninitialized(mask, MutableSpan((T *)dst, mask.min_array_size())); } + void materialize_compressed(const IndexMask mask, void *dst) const override + { + varray_.materialize_compressed(mask, MutableSpan((T *)dst, mask.size())); + } + + void materialize_compressed_to_uninitialized(const IndexMask mask, void *dst) const override + { + varray_.materialize_compressed_to_uninitialized(mask, MutableSpan((T *)dst, mask.size())); + } + bool try_assign_VArray(void *varray) const override { *(VArray *)varray = varray_; diff --git a/source/blender/blenlib/intern/generic_virtual_array.cc b/source/blender/blenlib/intern/generic_virtual_array.cc index b105d4452fc..6cdbbde671a 100644 --- a/source/blender/blenlib/intern/generic_virtual_array.cc +++ b/source/blender/blenlib/intern/generic_virtual_array.cc @@ -505,6 +505,22 @@ class GVArrayImpl_For_SlicedGVArray : public GVArrayImpl { { varray_.get_internal_single(r_value); } + + void materialize_compressed_to_uninitialized(const IndexMask mask, void *dst) const override + { + if (mask.is_range()) { + const IndexRange mask_range = mask.as_range(); + const IndexRange offset_mask_range{mask_range.start() + offset_, mask_range.size()}; + varray_.materialize_compressed_to_uninitialized(offset_mask_range, dst); + } + else { + Vector offset_mask_indices(mask.size()); + for (const int64_t i : mask.index_range()) { + offset_mask_indices[i] = mask[i] + offset_; + } + varray_.materialize_compressed_to_uninitialized(offset_mask_indices.as_span(), dst); + } + } }; /** \} */ @@ -562,6 +578,16 @@ void GVArrayCommon::materialize_to_uninitialized(const IndexMask mask, void *dst impl_->materialize_to_uninitialized(mask, dst); } +void GVArrayCommon::materialize_compressed(IndexMask mask, void *dst) const +{ + impl_->materialize_compressed(mask, dst); +} + +void GVArrayCommon::materialize_compressed_to_uninitialized(IndexMask mask, void *dst) const +{ + impl_->materialize_compressed_to_uninitialized(mask, dst); +} + bool GVArrayCommon::may_have_ownership() const { return impl_->may_have_ownership(); -- cgit v1.2.3