[Bf-blender-cvs] [b38ee6daabf] functions-experimental-refactor: generic array or single ref

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


Commit: b38ee6daabfaa05f65155d2d84f20224a1c4a9e8
Author: Jacques Lucke
Date:   Thu Oct 10 20:56:55 2019 +0200
Branches: functions-experimental-refactor
https://developer.blender.org/rBb38ee6daabfaa05f65155d2d84f20224a1c4a9e8

generic array or single ref

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

M	source/blender/blenkernel/BKE_generic_array_ref.h
M	source/blender/blenkernel/intern/node_functions.cc
M	source/blender/blenlib/BLI_array_or_single_ref.h

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

diff --git a/source/blender/blenkernel/BKE_generic_array_ref.h b/source/blender/blenkernel/BKE_generic_array_ref.h
index 7005cdac7a4..64cc7b3bd66 100644
--- a/source/blender/blenkernel/BKE_generic_array_ref.h
+++ b/source/blender/blenkernel/BKE_generic_array_ref.h
@@ -5,9 +5,11 @@
 #include "BKE_cpp_types.h"
 
 #include "BLI_array_ref.h"
+#include "BLI_array_or_single_ref.h"
 
 namespace BKE {
 
+using BLI::ArrayOrSingleRef;
 using BLI::ArrayRef;
 using BLI::MutableArrayRef;
 
@@ -53,6 +55,57 @@ class GenericArrayRef {
   }
 };
 
+class GenericArrayOrSingleRef {
+ private:
+  const CPPType *m_type;
+  const void *m_buffer;
+  uint m_array_size;
+  bool m_is_single;
+
+ public:
+  GenericArrayOrSingleRef() = delete;
+
+  GenericArrayOrSingleRef(const CPPType &type, const void *buffer, uint array_size, bool is_single)
+      : m_type(&type), m_buffer(buffer), m_array_size(array_size), m_is_single(is_single)
+  {
+  }
+
+  GenericArrayOrSingleRef(const CPPType &type) : GenericArrayOrSingleRef(type, nullptr, 0, false)
+  {
+  }
+
+  static GenericArrayOrSingleRef FromSingle(const CPPType &type,
+                                            const void *buffer,
+                                            uint array_size)
+  {
+    return GenericArrayOrSingleRef(type, buffer, array_size, true);
+  }
+
+  static GenericArrayOrSingleRef FromArray(const CPPType &type,
+                                           const void *buffer,
+                                           uint array_size)
+  {
+    return GenericArrayOrSingleRef(type, buffer, array_size, false);
+  }
+
+  template<typename T> ArrayOrSingleRef<T> as_typed_ref() const
+  {
+    BLI_assert(GET_TYPE<T>().is_same_or_generalization(*m_type));
+    return ArrayOrSingleRef<T>((const T *)m_buffer, m_array_size, m_is_single);
+  }
+
+  const void *operator[](uint index) const
+  {
+    BLI_assert(index < m_array_size);
+    if (m_is_single) {
+      return m_buffer;
+    }
+    else {
+      return POINTER_OFFSET(m_buffer, index * m_type->size());
+    }
+  }
+};
+
 class GenericMutableArrayRef {
  private:
   const CPPType *m_type;
diff --git a/source/blender/blenkernel/intern/node_functions.cc b/source/blender/blenkernel/intern/node_functions.cc
index 6c7909aa7fe..265a96386a8 100644
--- a/source/blender/blenkernel/intern/node_functions.cc
+++ b/source/blender/blenkernel/intern/node_functions.cc
@@ -38,7 +38,7 @@ class MultiFunction {
   class Params {
    public:
     template<typename T> ArrayOrSingleRef<T> readonly_single_input(uint index, StringRef name);
-    const GenericArrayRef &readonly_single_input(uint index, StringRef name);
+    GenericArrayOrSingleRef readonly_single_input(uint index, StringRef name);
 
     template<typename T> MutableArrayRef<T> single_output(uint index, StringRef name);
 
@@ -157,7 +157,7 @@ class MultiFunction_AppendToList : public MultiFunction {
   void call(ArrayRef<uint> mask_indices, Params &params) const override
   {
     GenericVectorArray &lists = params.mutable_vector(0, "List");
-    GenericArrayRef values = params.readonly_single_input(1, "Value");
+    GenericArrayOrSingleRef values = params.readonly_single_input(1, "Value");
 
     for (uint i : mask_indices) {
       lists.append_single__copy(i, values[i]);
diff --git a/source/blender/blenlib/BLI_array_or_single_ref.h b/source/blender/blenlib/BLI_array_or_single_ref.h
index 461b121a23a..66ec0017b6b 100644
--- a/source/blender/blenlib/BLI_array_or_single_ref.h
+++ b/source/blender/blenlib/BLI_array_or_single_ref.h
@@ -31,12 +31,12 @@ template<typename T> class ArrayOrSingleRef {
   uint m_array_size;
   bool m_is_single;
 
+ public:
   ArrayOrSingleRef(const T *buffer, uint array_size, bool is_single)
       : m_buffer(buffer), m_array_size(array_size), m_is_single(is_single)
   {
   }
 
- public:
   ArrayOrSingleRef() : ArrayOrSingleRef(nullptr, 0, false)
   {
   }
@@ -50,9 +50,9 @@ template<typename T> class ArrayOrSingleRef {
     return ArrayOrSingleRef(value, array_size, true);
   }
 
-  static ArrayOrSingleRef FromArray(const T *value, uint size)
+  static ArrayOrSingleRef FromArray(const T *value, uint array_size)
   {
-    return ArrayOrSingleRef(value, size, false);
+    return ArrayOrSingleRef(value, array_size, false);
   }
 
   const T &operator[](uint index) const



More information about the Bf-blender-cvs mailing list