[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