[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