[Bf-blender-cvs] [36446b587b0] virtual-array-attributes: add typed ref utilities

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


Commit: 36446b587b03e7e503dec9010a96aae335cc78cc
Author: Jacques Lucke
Date:   Sun Apr 11 11:47:46 2021 +0200
Branches: virtual-array-attributes
https://developer.blender.org/rB36446b587b03e7e503dec9010a96aae335cc78cc

add typed ref utilities

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

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 30ed8dde1c7..434f69fb648 100644
--- a/source/blender/functions/FN_generic_virtual_array.hh
+++ b/source/blender/functions/FN_generic_virtual_array.hh
@@ -660,4 +660,93 @@ class GVMutableArray_For_DerivedSpan
   }
 };
 
+template<typename T> class GVArray_TypedRef {
+ private:
+  const VArray<T> *varray_;
+  std::optional<VArray_For_Span<T>> varray_span_;
+  std::optional<VArray_For_Single<T>> varray_single_;
+  std::optional<VArray_For_GVArray<T>> varray_any_;
+
+ public:
+  GVArray_TypedRef(const GVArray &gvarray)
+  {
+    if (gvarray.is_span()) {
+      const GSpan span = gvarray.get_span();
+      varray_span_.emplace(span.typed<T>());
+      varray_ = &*varray_span_;
+    }
+    else if (gvarray.is_single()) {
+      T single_value;
+      gvarray.get_single(&single_value);
+      varray_single_.emplace(single_value, gvarray.size());
+      varray_ = &*varray_single_;
+    }
+    else {
+      varray_any_.emplace(gvarray);
+      varray_ = &*varray_any_;
+    }
+  }
+
+  const VArray<T> &operator*() const
+  {
+    return *varray_;
+  }
+
+  const VArray<T> *operator->() const
+  {
+    return varray_;
+  }
+
+  operator const VArray<T> &() const
+  {
+    return *varray_;
+  }
+
+  T operator[](const int64_t index) const
+  {
+    return varray_->get(index);
+  }
+};
+
+template<typename T> class GVMutableArray_TypedRef {
+ private:
+  VMutableArray<T> *varray_;
+  std::optional<VMutableArray_For_MutableSpan<T>> varray_span_;
+  std::optional<VMutableArray_For_GVMutableArray<T>> varray_any_;
+
+ public:
+  GVMutableArray_TypedRef(GVMutableArray &gvarray)
+  {
+    if (gvarray.is_span()) {
+      const GMutableSpan span = gvarray.get_span();
+      varray_span_.emplace(span.typed<T>());
+      varray_ = &*varray_span_;
+    }
+    else {
+      varray_any_.emplace(gvarray);
+      varray_ = &*varray_any_;
+    }
+  }
+
+  VMutableArray<T> &operator*()
+  {
+    return *varray_;
+  }
+
+  VMutableArray<T> *operator->()
+  {
+    return varray_;
+  }
+
+  operator VMutableArray<T> &()
+  {
+    return *varray_;
+  }
+
+  T operator[](const int64_t index) const
+  {
+    return varray_->get(index);
+  }
+};
+
 }  // namespace blender::fn



More information about the Bf-blender-cvs mailing list