[Bf-blender-cvs] [34ed0de2879] temp-varray-get-set-multiple: improve

Jacques Lucke noreply at git.blender.org
Sun Sep 26 15:09:35 CEST 2021


Commit: 34ed0de2879725f30d54499f312850b83855e861
Author: Jacques Lucke
Date:   Sun Sep 26 14:11:42 2021 +0200
Branches: temp-varray-get-set-multiple
https://developer.blender.org/rB34ed0de2879725f30d54499f312850b83855e861

improve

===================================================================

M	source/blender/blenlib/BLI_virtual_array.hh

===================================================================

diff --git a/source/blender/blenlib/BLI_virtual_array.hh b/source/blender/blenlib/BLI_virtual_array.hh
index 8c348625226..3843f838767 100644
--- a/source/blender/blenlib/BLI_virtual_array.hh
+++ b/source/blender/blenlib/BLI_virtual_array.hh
@@ -658,6 +658,12 @@ class VArray_For_DerivedSpan : public VArray<ElemT> {
  private:
   const StructT *data_;
 
+  template<typename OtherStructT,
+           typename OtherElemT,
+           OtherElemT (*OtherGetFunc)(const OtherStructT &),
+           void (*OtherSetFunc)(OtherStructT &, OtherElemT)>
+  friend class VMutableArray_For_DerivedSpan;
+
  public:
   VArray_For_DerivedSpan(const Span<StructT> data) : VArray<ElemT>(data.size()), data_(data.data())
   {
@@ -699,6 +705,9 @@ class VMutableArray_For_DerivedSpan : public VMutableArray<ElemT> {
  private:
   StructT *data_;
 
+  using SelfT = VMutableArray_For_DerivedSpan;
+  using ConstSelfT = const VArray_For_DerivedSpan<StructT, ElemT, GetFunc>;
+
  public:
   VMutableArray_For_DerivedSpan(const MutableSpan<StructT> data)
       : VMutableArray<ElemT>(data.size()), data_(data.data())
@@ -747,6 +756,22 @@ class VMutableArray_For_DerivedSpan : public VMutableArray<ElemT> {
       const ElemT src_value = src_varray.get_internal_single();
       mask.foreach_index([&](const int64_t i) { SetFunc(data_[i], src_value); });
     }
+    else if (const SelfT *src_varray_typed = dynamic_cast<const SelfT *>(&src_varray)) {
+      if (src_varray_typed->data_ == data_) {
+        /* Nothing to do. */
+        return;
+      }
+      mask.foreach_index(
+          [&](const int64_t i) { SetFunc(data_[i], GetFunc(src_varray_typed->data_[i])); });
+    }
+    else if (const ConstSelfT *src_varray_typed = dynamic_cast<const ConstSelfT *>(&src_varray)) {
+      if (src_varray_typed->data_ == data_) {
+        /* Nothing to do. */
+        return;
+      }
+      mask.foreach_index(
+          [&](const int64_t i) { SetFunc(data_[i], GetFunc(src_varray_typed->data_[i])); });
+    }
     else {
       mask.foreach_index([&](const int64_t i) { SetFunc(data_[i], src_varray.get(i)); });
     }
@@ -754,7 +779,9 @@ class VMutableArray_For_DerivedSpan : public VMutableArray<ElemT> {
 
   virtual bool can_set_multiple_efficiently_impl(const VArray<ElemT> &src_varray) const
   {
-    return src_varray.is_span() || src_varray.is_single();
+    return src_varray.is_span() || src_varray.is_single() ||
+           dynamic_cast<const SelfT *>(&src_varray) != nullptr ||
+           dynamic_cast<const ConstSelfT *>(&src_varray) != nullptr;
   }
 };



More information about the Bf-blender-cvs mailing list