[Bf-blender-cvs] [02d9d13a831] temp-varray-get-set-multiple: initial commit
Jacques Lucke
noreply at git.blender.org
Sun Sep 26 15:09:33 CEST 2021
Commit: 02d9d13a8311aacf2cc7ae5a19cbae0af2a735e8
Author: Jacques Lucke
Date: Sat Sep 25 14:37:12 2021 +0200
Branches: temp-varray-get-set-multiple
https://developer.blender.org/rB02d9d13a8311aacf2cc7ae5a19cbae0af2a735e8
initial commit
===================================================================
M source/blender/blenlib/BLI_virtual_array.hh
===================================================================
diff --git a/source/blender/blenlib/BLI_virtual_array.hh b/source/blender/blenlib/BLI_virtual_array.hh
index 1c02bce8411..37be239e5bc 100644
--- a/source/blender/blenlib/BLI_virtual_array.hh
+++ b/source/blender/blenlib/BLI_virtual_array.hh
@@ -43,6 +43,8 @@
namespace blender {
+template<typename T> class VMutableArray;
+
/* An immutable virtual array. */
template<typename T> class VArray {
protected:
@@ -63,6 +65,33 @@ template<typename T> class VArray {
return this->get_impl(index);
}
+ void get_multiple(VMutableArray<T> &dst_varray) const
+ {
+ this->get_multiple(dst_varray, IndexMask(size_));
+ }
+
+ void get_multiple(VMutableArray<T> &dst_varray, const IndexMask mask) const
+ {
+ BLI_assert(mask.min_array_size() <= size_);
+ BLI_assert(mask.min_array_size() <= dst_varray.size());
+ if (dst_varray.can_set_multiple_efficiently(*this)) {
+ dst_varray._set_multiple(*this, mask);
+ }
+ else {
+ this->_get_multiple(dst_varray, mask);
+ }
+ }
+
+ void _get_multiple(VMutableArray<T> &dst_varray, const IndexMask mask) const
+ {
+ this->get_multiple_impl(dst_varray, mask);
+ }
+
+ bool can_get_multiple_efficiently(const VMutableArray<T> &dst_varray) const
+ {
+ return this->can_get_multiple_efficiently_impl(dst_varray);
+ }
+
int64_t size() const
{
return size_;
@@ -152,6 +181,17 @@ template<typename T> class VArray {
protected:
virtual T get_impl(const int64_t index) const = 0;
+ virtual void get_multiple_impl(VMutableArray<T> &dst_varray, IndexMask mask) const
+ {
+ mask.foreach_index([&](const int i) { dst_varray.set(i, this->get(i)); });
+ }
+
+ virtual bool can_get_multiple_efficiently_impl(const VMutableArray<T> &dst_varray) const
+ {
+ UNUSED_VARS(dst_varray);
+ return false;
+ }
+
virtual bool is_span_impl() const
{
return false;
@@ -223,6 +263,33 @@ template<typename T> class VMutableArray : public VArray<T> {
this->set_impl(index, std::move(value));
}
+ void set_multiple(const VArray<T> &src_varray)
+ {
+ this->set_multiple(src_varray, IndexMask(this->size_));
+ }
+
+ void set_multiple(const VArray<T> &src_varray, const IndexMask mask)
+ {
+ BLI_assert(mask.min_array_size() <= this->size_);
+ BLI_assert(mask.min_array_size() <= src_varray.size());
+ if (src_varray.can_get_multiple_efficiently_impl(*this)) {
+ src_varray._get_multiple(*this, mask);
+ }
+ else {
+ this->_set_multiple(src_varray, mask);
+ }
+ }
+
+ void _set_multiple(const VArray<T> &src_varray, const IndexMask mask)
+ {
+ this->set_multiple_impl(src_varray, mask);
+ }
+
+ bool can_set_multiple_efficiently(const VArray<T> &src_varray) const
+ {
+ return this->can_get_multiple_efficiently_impl(src_varray);
+ }
+
/* Copy the values from the source span to all elements in the virtual array. */
void set_all(Span<T> src)
{
@@ -240,6 +307,17 @@ template<typename T> class VMutableArray : public VArray<T> {
protected:
virtual void set_impl(const int64_t index, T value) = 0;
+ virtual void set_multiple_impl(const VArray<T> &src_varray, IndexMask mask)
+ {
+ mask.foreach_index([&](const int index) { this->set(index, src_varray.get(index)); });
+ }
+
+ virtual bool can_set_multiple_efficiently_impl(const VArray<T> &src_varray) const
+ {
+ UNUSED_VARS(src_varray);
+ return false;
+ }
+
virtual void set_all_impl(Span<T> src)
{
if (this->is_span()) {
More information about the Bf-blender-cvs
mailing list