[Bf-blender-cvs] [534977ad3a2] virtual-array-attributes: improve conversion to typed

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


Commit: 534977ad3a2626f5eb892fbba441d560b23d474f
Author: Jacques Lucke
Date:   Sun Apr 11 12:03:50 2021 +0200
Branches: virtual-array-attributes
https://developer.blender.org/rB534977ad3a2626f5eb892fbba441d560b23d474f

improve conversion to typed

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

M	source/blender/functions/FN_generic_virtual_array.hh
M	source/blender/functions/intern/generic_virtual_array.cc

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

diff --git a/source/blender/functions/FN_generic_virtual_array.hh b/source/blender/functions/FN_generic_virtual_array.hh
index ee83dc2adef..f250a98244d 100644
--- a/source/blender/functions/FN_generic_virtual_array.hh
+++ b/source/blender/functions/FN_generic_virtual_array.hh
@@ -125,6 +125,12 @@ class GVArray {
 
   void materialize_to_uninitialized(const IndexMask mask, void *dst) const;
 
+  template<typename T> const VArray<T> *try_get_internal_varray() const
+  {
+    BLI_assert(type_->is<T>());
+    return (const VArray<T> *)this->try_get_internal_varray_impl();
+  }
+
  protected:
   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;
@@ -134,6 +140,8 @@ class GVArray {
 
   virtual bool is_single_impl() const;
   virtual void get_single_impl(void *UNUSED(r_value)) const;
+
+  virtual const void *try_get_internal_varray_impl() const;
 };
 
 class GVMutableArray : public GVArray {
@@ -170,22 +178,18 @@ class GVMutableArray : public GVArray {
     return GMutableSpan(span.type(), const_cast<void *>(span.data()), span.size());
   }
 
- protected:
-  virtual void set_by_copy_impl(const int64_t index, const void *value)
-  {
-    BUFFER_FOR_CPP_TYPE_VALUE(*type_, buffer);
-    type_->copy_to_uninitialized(value, buffer);
-    this->set_by_move_impl(index, buffer);
-    type_->destruct(buffer);
-  }
-
-  virtual void set_by_relocate_impl(const int64_t index, void *value)
+  template<typename T> VMutableArray<T> *try_get_internal_mutable_varray()
   {
-    this->set_by_move_impl(index, value);
-    type_->destruct(value);
+    BLI_assert(type_->is<T>());
+    return (VMutableArray<T> *)this->try_get_internal_mutable_varray_impl();
   }
 
+ protected:
+  virtual void set_by_copy_impl(const int64_t index, const void *value);
+  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 *try_get_internal_mutable_varray_impl();
 };
 
 class GVArray_For_GSpan : public GVArray {
@@ -337,6 +341,11 @@ template<typename T> class GVArray_For_VArray : public GVArray {
   {
     *(T *)r_value = varray_->get_single();
   }
+
+  const void *try_get_internal_varray_impl() const override
+  {
+    return varray_;
+  }
 };
 
 template<typename T> class VArray_For_GVArray : public VArray<T> {
@@ -514,6 +523,16 @@ template<typename T> class GVMutableArray_For_VMutableArray : public GVMutableAr
     T &value_ = *(T *)value;
     this->set(index, std::move(value));
   }
+
+  const void *try_get_internal_varray_impl() const override
+  {
+    return (const VArray<T> *)varray_;
+  }
+
+  void *try_get_internal_mutable_varray_impl() override
+  {
+    return varray_;
+  }
 };
 
 class GVArray_As_GSpan final : public GVArray_For_GSpan {
@@ -682,6 +701,9 @@ template<typename T> class GVArray_TypedRef {
       varray_single_.emplace(single_value, gvarray.size());
       varray_ = &*varray_single_;
     }
+    else if (VArray<T> *internal_varray = gvarray.try_get_internal_varray<T>()) {
+      varray_ = internal_varray;
+    }
     else {
       varray_any_.emplace(gvarray);
       varray_ = &*varray_any_;
@@ -724,6 +746,9 @@ template<typename T> class GVMutableArray_TypedRef {
       varray_span_.emplace(span.typed<T>());
       varray_ = &*varray_span_;
     }
+    else if (VMutableArray<T> *internal_varray = gvarray.try_get_internal_mutable_varray<T>()) {
+      varray_ = internal_varray;
+    }
     else {
       varray_any_.emplace(gvarray);
       varray_ = &*varray_any_;
diff --git a/source/blender/functions/intern/generic_virtual_array.cc b/source/blender/functions/intern/generic_virtual_array.cc
index a8dcd21b1dc..69cb8912612 100644
--- a/source/blender/functions/intern/generic_virtual_array.cc
+++ b/source/blender/functions/intern/generic_virtual_array.cc
@@ -57,6 +57,34 @@ void GVArray::get_single_impl(void *UNUSED(r_value)) const
   BLI_assert(false);
 }
 
+const void *GVArray::try_get_internal_varray_impl() const
+{
+  return nullptr;
+}
+
+/* --------------------------------------------------------------------
+ * GVMutableArray.
+ */
+
+void GVMutableArray::set_by_copy_impl(const int64_t index, const void *value)
+{
+  BUFFER_FOR_CPP_TYPE_VALUE(*type_, buffer);
+  type_->copy_to_uninitialized(value, buffer);
+  this->set_by_move_impl(index, buffer);
+  type_->destruct(buffer);
+}
+
+void GVMutableArray::set_by_relocate_impl(const int64_t index, void *value)
+{
+  this->set_by_move_impl(index, value);
+  type_->destruct(value);
+}
+
+void *GVMutableArray::try_get_internal_mutable_varray_impl()
+{
+  return nullptr;
+}
+
 /* --------------------------------------------------------------------
  * GVArray_For_GSpan.
  */



More information about the Bf-blender-cvs mailing list