[Bf-blender-cvs] [f84f8b2a02b] functions-experimental-refactor: combine lists

Jacques Lucke noreply at git.blender.org
Tue Oct 15 15:56:58 CEST 2019


Commit: f84f8b2a02bb74683a8a400ab2adc4abadf24181
Author: Jacques Lucke
Date:   Thu Oct 10 21:40:05 2019 +0200
Branches: functions-experimental-refactor
https://developer.blender.org/rBf84f8b2a02bb74683a8a400ab2adc4abadf24181

combine lists

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

M	source/blender/blenkernel/BKE_generic_vector_array.h
M	source/blender/blenkernel/intern/node_functions.cc

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

diff --git a/source/blender/blenkernel/BKE_generic_vector_array.h b/source/blender/blenkernel/BKE_generic_vector_array.h
index 297936dc5d4..1b8d754711a 100644
--- a/source/blender/blenkernel/BKE_generic_vector_array.h
+++ b/source/blender/blenkernel/BKE_generic_vector_array.h
@@ -61,23 +61,10 @@ class GenericVectorArray : BLI::NonCopyable, BLI::NonMovable {
     slice.length++;
   }
 
-  void append_all__copy(const GenericArrayRef &array)
+  void extend_single__copy(uint index, GenericArrayRef values)
   {
-    BLI_assert(m_array_size == array.size());
-
-    for (BufferSlice &slice : this->slices()) {
-      if (slice.length == slice.capacity) {
-        this->grow_single(slice, slice.length + 1);
-      }
-    }
-
-    const void *src_buffer = array.buffer();
-    for (BufferSlice &slice : this->slices()) {
-      void *dst = POINTER_OFFSET(slice.start, m_element_size * slice.length);
-      m_type.copy_to_uninitialized(src_buffer, dst);
-      slice.length++;
-
-      src_buffer = POINTER_OFFSET(src_buffer, m_element_size);
+    for (uint i = 0; i < values.size(); i++) {
+      this->append_single__copy(index, values[i]);
     }
   }
 
diff --git a/source/blender/blenkernel/intern/node_functions.cc b/source/blender/blenkernel/intern/node_functions.cc
index a74f30e58e5..db45da833fc 100644
--- a/source/blender/blenkernel/intern/node_functions.cc
+++ b/source/blender/blenkernel/intern/node_functions.cc
@@ -50,6 +50,7 @@ class MultiFunction {
     template<typename T>
     GenericVectorArray::MutableTypedRef<T> vector_output(uint index, StringRef name);
     GenericVectorArray &vector_output(uint index, StringRef name);
+
     GenericVectorArray &mutable_vector(uint index, StringRef name);
   };
 
@@ -57,7 +58,7 @@ class MultiFunction {
   virtual void call(ArrayRef<uint> mask_indices, Params &params) const = 0;
 };
 
-class MultiFunction_AddFloats : public MultiFunction {
+class MultiFunction_AddFloats final : public MultiFunction {
   void signature(Signature &signature) const override
   {
     signature.readonly_single_input<float>("A");
@@ -77,7 +78,7 @@ class MultiFunction_AddFloats : public MultiFunction {
   }
 };
 
-class MultiFunction_VectorDistance : public MultiFunction {
+class MultiFunction_VectorDistance final : public MultiFunction {
   void signature(Signature &signature) const override
   {
     signature.readonly_single_input<float3>("A");
@@ -97,7 +98,7 @@ class MultiFunction_VectorDistance : public MultiFunction {
   }
 };
 
-class MultiFunction_FloatArraySum : public MultiFunction {
+class MultiFunction_FloatArraySum final : public MultiFunction {
   void signature(Signature &signature) const override
   {
     signature.readonly_vector_input<float>("Array");
@@ -119,7 +120,7 @@ class MultiFunction_FloatArraySum : public MultiFunction {
   }
 };
 
-class MultiFunction_FloatRange : public MultiFunction {
+class MultiFunction_FloatRange final : public MultiFunction {
   void signature(Signature &signature) const override
   {
     signature.readonly_single_input<float>("Start");
@@ -144,7 +145,7 @@ class MultiFunction_FloatRange : public MultiFunction {
   }
 };
 
-class MultiFunction_AppendToList : public MultiFunction {
+class MultiFunction_AppendToList final : public MultiFunction {
  private:
   CPPType &m_base_type;
 
@@ -166,7 +167,7 @@ class MultiFunction_AppendToList : public MultiFunction {
   }
 };
 
-class MultiFunction_GetListElement : public MultiFunction {
+class MultiFunction_GetListElement final : public MultiFunction {
  private:
   CPPType &m_base_type;
 
@@ -201,7 +202,7 @@ class MultiFunction_GetListElement : public MultiFunction {
   }
 };
 
-class MultiFunction_ListLength : public MultiFunction {
+class MultiFunction_ListLength final : public MultiFunction {
  private:
   CPPType &m_base_type;
 
@@ -223,4 +224,26 @@ class MultiFunction_ListLength : public MultiFunction {
   }
 };
 
+class MultiFunction_CombineLists final : public MultiFunction {
+ private:
+  CPPType &m_base_type;
+
+ public:
+  void signature(Signature &signature) const override
+  {
+    signature.mutable_vector("List", m_base_type);
+    signature.readonly_vector_input("Other", m_base_type);
+  }
+
+  void call(ArrayRef<uint> mask_indices, Params &params) const override
+  {
+    GenericVectorArray &lists = params.mutable_vector(0, "List");
+    GenericVectorArrayOrSingleRef others = params.readonly_vector_input(1, "Other");
+
+    for (uint i : mask_indices) {
+      lists.extend_single__copy(i, others[i]);
+    }
+  }
+};
+
 }  // namespace BKE
\ No newline at end of file



More information about the Bf-blender-cvs mailing list