[Bf-blender-cvs] [bb579c49648] virtual-array-attributes: simplify

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


Commit: bb579c4964824b57ef97c27b7b5056c68b8c1191
Author: Jacques Lucke
Date:   Sat Apr 10 16:56:28 2021 +0200
Branches: virtual-array-attributes
https://developer.blender.org/rBbb579c4964824b57ef97c27b7b5056c68b8c1191

simplify

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

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 dd76fa2d5d0..1ffc0275639 100644
--- a/source/blender/functions/FN_generic_virtual_array.hh
+++ b/source/blender/functions/FN_generic_virtual_array.hh
@@ -268,51 +268,62 @@ class GVArrayForSingleValueRef : public GVArray {
 
 template<typename T> class GVArrayForVArray : public GVArray {
  private:
-  const VArray<T> &varray_;
+  const VArray<T> *varray_ = nullptr;
   std::unique_ptr<VArray<T>> owned_varray_;
 
  public:
   GVArrayForVArray(const VArray<T> &varray)
-      : GVArray(CPPType::get<T>(), varray.size()), varray_(varray)
+      : GVArray(CPPType::get<T>(), varray.size()), varray_(&varray)
   {
   }
 
   GVArrayForVArray(std::unique_ptr<VArray<T>> varray)
       : GVArray(CPPType::get<T>(), varray->size()),
-        varray_(*varray),
+        varray_(varray.get()),
         owned_varray_(std::move(varray))
   {
   }
 
+  /* When this constructor is used, the #set_varray method has to be used as well. */
+  GVArrayForVArray(const int64_t size) : GVArray(CPPType::get<T>(), size)
+  {
+  }
+
  protected:
+  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);
+    *(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));
+    new (r_value) T(varray_->get(index));
   }
 
   bool is_span_impl() const override
   {
-    return varray_.is_span();
+    return varray_->is_span();
   }
 
   GSpan get_span_impl() const override
   {
-    return GSpan(varray_.get_span());
+    return GSpan(varray_->get_span());
   }
 
   bool is_single_impl() const override
   {
-    return varray_.is_single();
+    return varray_->is_single();
   }
 
   void get_single_impl(void *r_value) const override
   {
-    *(T *)r_value = varray_.get_single();
+    *(T *)r_value = varray_->get_single();
   }
 };
 
@@ -416,46 +427,17 @@ template<typename T> class VMutableArrayForGVMutableArray : public VMutableArray
   }
 };
 
-template<typename T, typename VArrayT> class GVArrayForEmbeddedVArray : public GVArray {
+template<typename T, typename VArrayT>
+class GVArrayForEmbeddedVArray : public GVArrayForVArray<T> {
  private:
   VArrayT varray_;
 
  public:
   template<typename... Args>
   GVArrayForEmbeddedVArray(const int64_t size, Args &&... args)
-      : GVArray(CPPType::get<T>(), size), varray_(std::forward<Args>(args)...)
-  {
-  }
-
- protected:
-  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
+      : GVArrayForVArray<T>(size), varray_(std::forward<Args>(args)...)
   {
-    *(T *)r_value = varray_.get_single();
+    this->set_varray(varray_);
   }
 };



More information about the Bf-blender-cvs mailing list