[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 ¶ms) 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