Function: add method to create shallow copy of virtual array
Creating a shallow copy is sometimes useful to get a unique ptr for a virtual array when one only has a reference. It shouldn't be used usually, but sometimes its the fastest way to do correct ownership handling.
This commit is contained in:
		@@ -34,6 +34,12 @@ namespace blender::fn {
 | 
				
			|||||||
template<typename T> class GVArray_Typed;
 | 
					template<typename T> class GVArray_Typed;
 | 
				
			||||||
template<typename T> class GVMutableArray_Typed;
 | 
					template<typename T> class GVMutableArray_Typed;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class GVArray;
 | 
				
			||||||
 | 
					class GVMutableArray;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					using GVArrayPtr = std::unique_ptr<GVArray>;
 | 
				
			||||||
 | 
					using GVMutableArrayPtr = std::unique_ptr<GVMutableArray>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* A generically typed version of `VArray<T>`. */
 | 
					/* A generically typed version of `VArray<T>`. */
 | 
				
			||||||
class GVArray {
 | 
					class GVArray {
 | 
				
			||||||
 protected:
 | 
					 protected:
 | 
				
			||||||
@@ -143,6 +149,8 @@ class GVArray {
 | 
				
			|||||||
    return GVArray_Typed<T>(*this);
 | 
					    return GVArray_Typed<T>(*this);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  GVArrayPtr shallow_copy() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 protected:
 | 
					 protected:
 | 
				
			||||||
  virtual void get_impl(const int64_t index, void *r_value) const;
 | 
					  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;
 | 
					  virtual void get_to_uninitialized_impl(const int64_t index, void *r_value) const = 0;
 | 
				
			||||||
@@ -215,9 +223,6 @@ class GVMutableArray : public GVArray {
 | 
				
			|||||||
  virtual void *try_get_internal_mutable_varray_impl();
 | 
					  virtual void *try_get_internal_mutable_varray_impl();
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using GVArrayPtr = std::unique_ptr<GVArray>;
 | 
					 | 
				
			||||||
using GVMutableArrayPtr = std::unique_ptr<GVMutableArray>;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class GVArray_For_GSpan : public GVArray {
 | 
					class GVArray_For_GSpan : public GVArray {
 | 
				
			||||||
 protected:
 | 
					 protected:
 | 
				
			||||||
  const void *data_ = nullptr;
 | 
					  const void *data_ = nullptr;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,6 +18,37 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace blender::fn {
 | 
					namespace blender::fn {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* --------------------------------------------------------------------
 | 
				
			||||||
 | 
					 * GVArray_For_ShallowCopy.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class GVArray_For_ShallowCopy : public GVArray {
 | 
				
			||||||
 | 
					 private:
 | 
				
			||||||
 | 
					  const GVArray &varray_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  GVArray_For_ShallowCopy(const GVArray &varray)
 | 
				
			||||||
 | 
					      : GVArray(varray.type(), varray.size()), varray_(varray)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 private:
 | 
				
			||||||
 | 
					  void get_impl(const int64_t index, void *r_value) const override
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    varray_.get(index, r_value);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void get_to_uninitialized_impl(const int64_t index, void *r_value) const override
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    varray_.get_to_uninitialized(index, r_value);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void materialize_to_uninitialized_impl(const IndexMask mask, void *dst) const override
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    varray_.materialize_to_uninitialized(mask, dst);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* --------------------------------------------------------------------
 | 
					/* --------------------------------------------------------------------
 | 
				
			||||||
 * GVArray.
 | 
					 * GVArray.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@@ -73,6 +104,26 @@ const void *GVArray::try_get_internal_varray_impl() const
 | 
				
			|||||||
  return nullptr;
 | 
					  return nullptr;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Creates a new `std::unique_ptr<GVArray>` based on this `GVArray`.
 | 
				
			||||||
 | 
					 * The lifetime of the returned virtual array must not be longer than the lifetime of this virtual
 | 
				
			||||||
 | 
					 * array.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					GVArrayPtr GVArray::shallow_copy() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (this->is_span()) {
 | 
				
			||||||
 | 
					    return std::make_unique<GVArray_For_GSpan>(this->get_internal_span());
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (this->is_single()) {
 | 
				
			||||||
 | 
					    BUFFER_FOR_CPP_TYPE_VALUE(*type_, buffer);
 | 
				
			||||||
 | 
					    this->get_internal_single(buffer);
 | 
				
			||||||
 | 
					    std::unique_ptr new_varray = std::make_unique<GVArray_For_SingleValue>(*type_, size_, buffer);
 | 
				
			||||||
 | 
					    type_->destruct(buffer);
 | 
				
			||||||
 | 
					    return new_varray;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return std::make_unique<GVArray_For_ShallowCopy>(*this);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* --------------------------------------------------------------------
 | 
					/* --------------------------------------------------------------------
 | 
				
			||||||
 * GVMutableArray.
 | 
					 * GVMutableArray.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user