[Bf-blender-cvs] [42d3210681b] temp-varray-get-set-multiple: progress
Jacques Lucke
noreply at git.blender.org
Sun Sep 26 15:09:33 CEST 2021
Commit: 42d3210681bb358943bda43ef4125931037056ad
Author: Jacques Lucke
Date: Sat Sep 25 15:35:43 2021 +0200
Branches: temp-varray-get-set-multiple
https://developer.blender.org/rB42d3210681bb358943bda43ef4125931037056ad
progress
===================================================================
M source/blender/blenlib/BLI_virtual_array.hh
M source/blender/functions/FN_generic_virtual_array.hh
M source/blender/functions/intern/generic_virtual_array.cc
===================================================================
diff --git a/source/blender/blenlib/BLI_virtual_array.hh b/source/blender/blenlib/BLI_virtual_array.hh
index aa29b15846b..f08a21e18e0 100644
--- a/source/blender/blenlib/BLI_virtual_array.hh
+++ b/source/blender/blenlib/BLI_virtual_array.hh
@@ -73,9 +73,14 @@ template<typename T> class VArray {
}
void get_multiple(MutableSpan<T> dst) const
+ {
+ return this->get_multiple(dst, IndexMask(size_));
+ }
+
+ void get_multiple(MutableSpan<T> dst, IndexMask mask) const
{
VMutableArray_For_MutableSpan<T> varray(dst);
- return this->get_multiple(varray);
+ return this->get_multiple(varray, mask);
}
void get_multiple(VMutableArray<T> &dst_varray, const IndexMask mask) const
@@ -100,6 +105,23 @@ template<typename T> class VArray {
return this->can_get_multiple_efficiently_impl(dst_varray);
}
+ void get_multiple_to_uninitialized(T *dst) const
+ {
+ this->get_multiple_to_uninitialized(dst);
+ }
+
+ void get_multiple_to_uninitialized(T *dst, IndexMask mask) const
+ {
+ BLI_assert(mask.min_array_size() <= size_);
+ BLI_assert(mask.min_array_size() <= dst.size());
+ if constexpr (std::is_trivial_v<T>) {
+ this->get_multiple(dst, mask);
+ }
+ else {
+ this->get_multiple_to_uninitialized_impl(dst, mask);
+ }
+ }
+
int64_t size() const
{
return size_;
@@ -178,7 +200,12 @@ template<typename T> class VArray {
virtual void get_multiple_impl(VMutableArray<T> &dst_varray, IndexMask mask) const
{
- mask.foreach_index([&](const int i) { dst_varray.set(i, this->get(i)); });
+ mask.foreach_index([&](const int64_t i) { dst_varray.set(i, this->get(i)); });
+ }
+
+ virtual void get_multiple_to_uninitialized_impl(T *dst, IndexMask mask) const
+ {
+ mask.foreach_index([&](const int64_t i) { new (dst + i) T(this->get(i)); });
}
virtual bool can_get_multiple_efficiently_impl(const VMutableArray<T> &dst_varray) const
diff --git a/source/blender/functions/FN_generic_virtual_array.hh b/source/blender/functions/FN_generic_virtual_array.hh
index 83f76079620..69192f13109 100644
--- a/source/blender/functions/FN_generic_virtual_array.hh
+++ b/source/blender/functions/FN_generic_virtual_array.hh
@@ -88,10 +88,13 @@ class GVArray {
void get_multiple(GVMutableArray &dst_varray) const;
void get_multiple(GMutableSpan dst) const;
- void get_multiple(GVMutableArray &dst_varray, const IndexMask mask) const;
- void _get_multiple(GVMutableArray &dst_varray, const IndexMask mask) const;
+ void get_multiple(GVMutableArray &dst_varray, IndexMask mask) const;
+ void _get_multiple(GVMutableArray &dst_varray, IndexMask mask) const;
bool _can_get_multiple_efficiently(const GVMutableArray &dst_varray) const;
+ void get_multiple_to_uninitialized(void *dst) const;
+ void get_multiple_to_uninitialized(void *dst, IndexMask mask) const;
+
/* Returns true when the virtual array is stored as a span internally. */
bool is_span() const
{
@@ -165,6 +168,8 @@ class GVArray {
virtual void get_multiple_impl(GVMutableArray &dst_varray, IndexMask mask) const;
virtual bool can_get_multiple_efficiently_impl(const GVMutableArray &dst_varray) const;
+ virtual void get_multiple_to_uninitialized_impl(void *dst, IndexMask mask) const;
+
virtual bool is_span_impl() const;
virtual GSpan get_internal_span_impl() const;
diff --git a/source/blender/functions/intern/generic_virtual_array.cc b/source/blender/functions/intern/generic_virtual_array.cc
index 1e81f0661ad..bae9b6d6bb5 100644
--- a/source/blender/functions/intern/generic_virtual_array.cc
+++ b/source/blender/functions/intern/generic_virtual_array.cc
@@ -90,7 +90,7 @@ void GVArray::_get_multiple(GVMutableArray &dst_varray, const IndexMask mask) co
void GVArray::get_multiple_impl(GVMutableArray &dst_varray, const IndexMask mask) const
{
BUFFER_FOR_CPP_TYPE_VALUE(*type_, buffer);
- for (const int i : mask) {
+ for (const int64_t i : mask) {
this->get_to_uninitialized(i, buffer);
dst_varray.set_by_relocate(i, buffer);
}
@@ -101,6 +101,26 @@ bool GVArray::can_get_multiple_efficiently_impl(const GVMutableArray &UNUSED(dst
return false;
}
+void GVArray::get_multiple_to_uninitialized(void *dst) const
+{
+ this->get_multiple_to_uninitialized(dst, IndexMask(size_));
+}
+
+void GVArray::get_multiple_to_uninitialized(void *dst, IndexMask mask) const
+{
+ BLI_assert(mask.min_array_size() <= size_);
+ BLI_assert(mask.min_array_size() <= dst.size());
+ this->get_multiple_to_uninitialized_impl(dst, mask);
+}
+
+void GVArray::get_multiple_to_uninitialized_impl(void *dst, IndexMask mask) const
+{
+ mask.foreach_index([&](const int64_t i) {
+ void *elem_dst = POINTER_OFFSET(dst, type_->size() * i);
+ this->get_to_uninitialized(i, elem_dst);
+ });
+}
+
void GVArray::materialize_to_uninitialized(void *dst) const
{
this->materialize_to_uninitialized(IndexMask(size_), dst);
@@ -226,7 +246,7 @@ bool GVMutableArray::_can_set_multiple_efficiently(const GVArray &src_varray) co
void GVMutableArray::set_multiple_by_copy_impl(const GVArray &src_varray, const IndexMask mask)
{
BUFFER_FOR_CPP_TYPE_VALUE(*type_, buffer);
- for (const int i : mask) {
+ for (const int64_t i : mask) {
src_varray.get_to_uninitialized(i, buffer);
this->set_by_relocate(i, buffer);
}
More information about the Bf-blender-cvs
mailing list