[Bf-blender-cvs] [c0b7b16167d] virtual-array-attributes: add GVMutableArrayForVMutableArray

Jacques Lucke noreply at git.blender.org
Mon Apr 12 18:27:53 CEST 2021


Commit: c0b7b16167d68447a89642cdef1afe68618af57a
Author: Jacques Lucke
Date:   Sat Apr 10 17:11:40 2021 +0200
Branches: virtual-array-attributes
https://developer.blender.org/rBc0b7b16167d68447a89642cdef1afe68618af57a

add GVMutableArrayForVMutableArray

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

M	source/blender/functions/FN_generic_virtual_array.hh

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

diff --git a/source/blender/functions/FN_generic_virtual_array.hh b/source/blender/functions/FN_generic_virtual_array.hh
index 298b7a72c0b..b88e0b8f892 100644
--- a/source/blender/functions/FN_generic_virtual_array.hh
+++ b/source/blender/functions/FN_generic_virtual_array.hh
@@ -423,6 +423,73 @@ template<typename T> class VMutableArrayForGVMutableArray : public VMutableArray
   }
 };
 
+template<typename T> class GVMutableArrayForVMutableArray : public GVMutableArray {
+ private:
+  VMutableArray<T> *varray_ = nullptr;
+
+ public:
+  GVMutableArrayForVMutableArray(VMutableArray<T> &varray)
+      : GVMutableArray(CPPType::get<T>(), varray.size()), varray_(&varray)
+  {
+  }
+
+ private:
+  void set_varray(const VArray<T> &varray)
+  {
+    BLI_assert(varray.size() == size_);
+    varray_ = &varray;
+  }
+
+  void get_impl(const int64_t index, void *r_value) const override
+  {
+    *(T *)r_value = varray_->get(index);
+  }
+
+  void get_to_uninitialized_impl(const int64_t index, void *r_value) const override
+  {
+    new (r_value) T(varray_->get(index));
+  }
+
+  bool is_span_impl() const override
+  {
+    return varray_->is_span();
+  }
+
+  GSpan get_span_impl() const override
+  {
+    return GSpan(varray_->get_span());
+  }
+
+  bool is_single_impl() const override
+  {
+    return varray_->is_single();
+  }
+
+  void get_single_impl(void *r_value) const override
+  {
+    *(T *)r_value = varray_->get_single();
+  }
+
+  void set_by_copy_impl(const int64_t index, const void *value) override
+  {
+    const T &value_ = *(const T *)value;
+    varray_->set(index, value_);
+  }
+
+  void set_by_relocate_impl(const int64_t index, void *value) override
+  {
+    T &value_ = *(T *)value;
+    varray_->set(index, std::move(value));
+    value_.~T();
+  }
+
+  void set_by_move_impl(const int64_t index, void *value) override
+  {
+    T &value_ = *(T *)value;
+    this->set(index, std::move(value));
+  }
+};
+
 template<typename T> class GVArrayForOwnedVArray : public GVArrayForVArray<T> {
  private:
   std::unique_ptr<VArray<T>> owned_varray_;



More information about the Bf-blender-cvs mailing list