Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/functions/FN_generic_virtual_array.hh')
-rw-r--r--source/blender/functions/FN_generic_virtual_array.hh46
1 files changed, 46 insertions, 0 deletions
diff --git a/source/blender/functions/FN_generic_virtual_array.hh b/source/blender/functions/FN_generic_virtual_array.hh
index f429243e2de..703118ba23e 100644
--- a/source/blender/functions/FN_generic_virtual_array.hh
+++ b/source/blender/functions/FN_generic_virtual_array.hh
@@ -911,4 +911,50 @@ template<typename T> class GVMutableArray_Typed {
}
};
+class GVArray_For_SlicedGVArray : public GVArray {
+ protected:
+ const GVArray &varray_;
+ int64_t offset_;
+
+ public:
+ GVArray_For_SlicedGVArray(const GVArray &varray, const IndexRange slice)
+ : GVArray(varray.type(), slice.size()), varray_(varray), offset_(slice.start())
+ {
+ BLI_assert(slice.one_after_last() <= varray.size());
+ }
+
+ /* TODO: Add #materialize method. */
+ void get_impl(const int64_t index, void *r_value) const override;
+ void get_to_uninitialized_impl(const int64_t index, void *r_value) const override;
+};
+
+/**
+ * Utility class to create the "best" sliced virtual array.
+ */
+class GVArray_Slice {
+ private:
+ const GVArray *varray_;
+ /* Of these optional virtual arrays, at most one is constructed at any time. */
+ std::optional<GVArray_For_GSpan> varray_span_;
+ std::optional<GVArray_For_SlicedGVArray> varray_any_;
+
+ public:
+ GVArray_Slice(const GVArray &varray, const IndexRange slice);
+
+ const GVArray &operator*()
+ {
+ return *varray_;
+ }
+
+ const GVArray *operator->()
+ {
+ return varray_;
+ }
+
+ operator const GVArray &()
+ {
+ return *varray_;
+ }
+};
+
} // namespace blender::fn