[Bf-blender-cvs] [ad114f806b0] temp-varray-get-set-multiple: progress
Jacques Lucke
noreply at git.blender.org
Sun Sep 26 15:09:33 CEST 2021
Commit: ad114f806b06b07d6738baa1004ebdcdbf98bc5e
Author: Jacques Lucke
Date: Sat Sep 25 15:01:09 2021 +0200
Branches: temp-varray-get-set-multiple
https://developer.blender.org/rBad114f806b06b07d6738baa1004ebdcdbf98bc5e
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 37be239e5bc..3beb75ff1c1 100644
--- a/source/blender/blenlib/BLI_virtual_array.hh
+++ b/source/blender/blenlib/BLI_virtual_array.hh
@@ -74,7 +74,7 @@ template<typename T> class VArray {
{
BLI_assert(mask.min_array_size() <= size_);
BLI_assert(mask.min_array_size() <= dst_varray.size());
- if (dst_varray.can_set_multiple_efficiently(*this)) {
+ if (dst_varray._can_set_multiple_efficiently(*this)) {
dst_varray._set_multiple(*this, mask);
}
else {
@@ -87,7 +87,7 @@ template<typename T> class VArray {
this->get_multiple_impl(dst_varray, mask);
}
- bool can_get_multiple_efficiently(const VMutableArray<T> &dst_varray) const
+ bool _can_get_multiple_efficiently(const VMutableArray<T> &dst_varray) const
{
return this->can_get_multiple_efficiently_impl(dst_varray);
}
@@ -272,7 +272,7 @@ template<typename T> class VMutableArray : public VArray<T> {
{
BLI_assert(mask.min_array_size() <= this->size_);
BLI_assert(mask.min_array_size() <= src_varray.size());
- if (src_varray.can_get_multiple_efficiently_impl(*this)) {
+ if (src_varray._can_get_multiple_efficiently(*this)) {
src_varray._get_multiple(*this, mask);
}
else {
@@ -285,7 +285,7 @@ template<typename T> class VMutableArray : public VArray<T> {
this->set_multiple_impl(src_varray, mask);
}
- bool can_set_multiple_efficiently(const VArray<T> &src_varray) const
+ bool _can_set_multiple_efficiently(const VArray<T> &src_varray) const
{
return this->can_get_multiple_efficiently_impl(src_varray);
}
diff --git a/source/blender/functions/FN_generic_virtual_array.hh b/source/blender/functions/FN_generic_virtual_array.hh
index 703118ba23e..ba6439ebed0 100644
--- a/source/blender/functions/FN_generic_virtual_array.hh
+++ b/source/blender/functions/FN_generic_virtual_array.hh
@@ -86,6 +86,11 @@ class GVArray {
this->get_to_uninitialized_impl(index, r_value);
}
+ void get_multiple(GVMutableArray &dst_varray) const;
+ void get_multiple(GVMutableArray &dst_varray, const IndexMask mask) const;
+ void _get_multiple(GVMutableArray &dst_varray, const IndexMask mask) const;
+ bool _can_get_multiple_efficiently(const GVMutableArray &dst_varray) const;
+
/* Returns true when the virtual array is stored as a span internally. */
bool is_span() const
{
@@ -159,6 +164,9 @@ class GVArray {
virtual void get_impl(const int64_t index, void *r_value) const;
virtual void get_to_uninitialized_impl(const int64_t index, void *r_value) const = 0;
+ virtual void get_multiple_impl(GVMutableArray &dst_varray, IndexMask mask) const;
+ virtual bool can_get_multiple_efficiently_impl(const GVMutableArray &dst_varray) const;
+
virtual bool is_span_impl() const;
virtual GSpan get_internal_span_impl() const;
@@ -199,6 +207,11 @@ class GVMutableArray : public GVArray {
this->set_by_relocate_impl(index, value);
}
+ void set_multiple_by_copy(const GVArray &src_varray);
+ void set_multiple_by_copy(const GVArray &src_varray, const IndexMask mask);
+ void _set_multiple_by_copy(const GVArray &src_varray, const IndexMask mask);
+ bool _can_set_multiple_efficiently(const GVArray &src_varray) const;
+
GMutableSpan get_internal_span()
{
BLI_assert(this->is_span());
@@ -231,6 +244,9 @@ class GVMutableArray : public GVArray {
virtual void set_by_relocate_impl(const int64_t index, void *value);
virtual void set_by_move_impl(const int64_t index, void *value) = 0;
+ virtual void set_multiple_by_copy_impl(const GVArray &src_varray, IndexMask mask);
+ virtual bool can_set_multiple_efficiently_impl(const GVArray &src_varray) const;
+
virtual void set_all_impl(const void *src);
virtual void *try_get_internal_mutable_varray_impl();
diff --git a/source/blender/functions/intern/generic_virtual_array.cc b/source/blender/functions/intern/generic_virtual_array.cc
index 9a83d8cd497..3b269a64d7c 100644
--- a/source/blender/functions/intern/generic_virtual_array.cc
+++ b/source/blender/functions/intern/generic_virtual_array.cc
@@ -53,6 +53,48 @@ class GVArray_For_ShallowCopy : public GVArray {
* GVArray.
*/
+void GVArray::get_multiple(GVMutableArray &dst_varray) const
+{
+ this->get_multiple(dst_varray, IndexMask(size_));
+}
+
+void GVArray::get_multiple(GVMutableArray &dst_varray, const IndexMask mask) const
+{
+ if (dst_varray._can_set_multiple_efficiently(*this)) {
+ dst_varray._set_multiple_by_copy(*this, mask);
+ }
+ else {
+ this->_get_multiple(dst_varray, mask);
+ }
+}
+
+bool GVArray::_can_get_multiple_efficiently(const GVMutableArray &dst_varray) const
+{
+ return this->can_get_multiple_efficiently_impl(dst_varray);
+}
+
+void GVArray::_get_multiple(GVMutableArray &dst_varray, const IndexMask mask) const
+{
+ BLI_assert(dst_varray.type() == *type_);
+ BLI_assert(mask.min_array_size() <= size_);
+ BLI_assert(mask.min_array_size() <= dst_varray.size());
+ this->get_multiple_impl(dst_varray, mask);
+}
+
+void GVArray::get_multiple_impl(GVMutableArray &dst_varray, const IndexMask mask) const
+{
+ BUFFER_FOR_CPP_TYPE_VALUE(*type_, buffer);
+ for (const int i : mask) {
+ this->get_to_uninitialized(i, buffer);
+ dst_varray.set_by_relocate(i, buffer);
+ }
+}
+
+bool GVArray::can_get_multiple_efficiently_impl(const GVMutableArray &UNUSED(dst_varray)) const
+{
+ return false;
+}
+
void GVArray::materialize(void *dst) const
{
this->materialize(IndexMask(size_), dst);
@@ -160,6 +202,48 @@ void GVMutableArray::set_by_relocate_impl(const int64_t index, void *value)
type_->destruct(value);
}
+void GVMutableArray::set_multiple_by_copy(const GVArray &src_varray)
+{
+ this->set_multiple_by_copy(src_varray, IndexMask(size_));
+}
+
+void GVMutableArray::set_multiple_by_copy(const GVArray &src_varray, const IndexMask mask)
+{
+ if (src_varray._can_get_multiple_efficiently(*this)) {
+ src_varray._get_multiple(*this, mask);
+ }
+ else {
+ this->_set_multiple_by_copy(src_varray, mask);
+ }
+}
+
+void GVMutableArray::_set_multiple_by_copy(const GVArray &src_varray, const IndexMask mask)
+{
+ BLI_assert(src_varray.type() == *type_);
+ BLI_assert(mask.min_array_size() <= size_);
+ BLI_assert(mask.min_array_size() <= src_varray.size());
+ this->set_multiple_by_copy_impl(src_varray, mask);
+}
+
+bool GVMutableArray::_can_set_multiple_efficiently(const GVArray &src_varray) const
+{
+ return this->can_set_multiple_efficiently_impl(src_varray);
+}
+
+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) {
+ src_varray.get_to_uninitialized(i, buffer);
+ this->set_by_relocate(i, buffer);
+ }
+}
+
+bool GVMutableArray::can_set_multiple_efficiently_impl(const GVArray &UNUSED(src_varray)) const
+{
+ return false;
+}
+
void GVMutableArray::set_all_impl(const void *src)
{
if (this->is_span()) {
More information about the Bf-blender-cvs
mailing list