[Bf-blender-cvs] [f0b62c43ef6] functions-experimental-refactor: start implementing Params
Jacques Lucke
noreply at git.blender.org
Tue Oct 15 15:57:25 CEST 2019
Commit: f0b62c43ef636133fac53d7d9cdb0c90d8a7954a
Author: Jacques Lucke
Date: Sun Oct 13 14:53:45 2019 +0200
Branches: functions-experimental-refactor
https://developer.blender.org/rBf0b62c43ef636133fac53d7d9cdb0c90d8a7954a
start implementing Params
===================================================================
M source/blender/blenkernel/BKE_generic_vector_array.h
M source/blender/blenkernel/BKE_multi_function.h
M source/blender/blenkernel/intern/BKE_multi_functions.h
M source/blender/blenkernel/intern/multi_functions.cc
===================================================================
diff --git a/source/blender/blenkernel/BKE_generic_vector_array.h b/source/blender/blenkernel/BKE_generic_vector_array.h
index e5bc9e412a3..ab986b41fe8 100644
--- a/source/blender/blenkernel/BKE_generic_vector_array.h
+++ b/source/blender/blenkernel/BKE_generic_vector_array.h
@@ -116,6 +116,12 @@ class GenericVectorArray : BLI::NonCopyable, BLI::NonMovable {
return TypedRef<T>(*this);
}
+ template<typename T> MutableTypedRef<T> as_mutable_typed_ref()
+ {
+ BLI_assert(GET_TYPE<T>().is_same_or_generalization(m_type));
+ return MutableTypedRef<T>(*this);
+ }
+
private:
void grow_single(BufferSlice &slice, uint min_capacity)
{
@@ -183,6 +189,11 @@ class GenericVectorArrayOrSingleRef {
return (*m_data)[index].get_ref<T>();
}
};
+
+ template<typename T> TypedRef<T> as_typed_ref() const
+ {
+ return TypedRef<T>(*this);
+ }
};
}; // namespace BKE
diff --git a/source/blender/blenkernel/BKE_multi_function.h b/source/blender/blenkernel/BKE_multi_function.h
index 7717d1f6b12..1a03de945d0 100644
--- a/source/blender/blenkernel/BKE_multi_function.h
+++ b/source/blender/blenkernel/BKE_multi_function.h
@@ -8,7 +8,7 @@ namespace BKE {
class MultiFunction {
public:
- class Signature {
+ class SignatureBuilder {
public:
template<typename T> void readonly_single_input(StringRef name);
void readonly_single_input(StringRef name, CPPType &type);
@@ -25,27 +25,94 @@ class MultiFunction {
void mutable_vector(StringRef name, CPPType &base_type);
};
+ class Signature {
+ public:
+ uint get_corrected_index(uint index);
+
+ template<typename T> bool is_readonly_single_input(uint index, StringRef name) const;
+ bool is_readonly_single_input(uint index, StringRef name) const;
+
+ template<typename T> bool is_single_output(uint index, StringRef name) const;
+ bool is_single_output(uint index, StringRef name) const;
+
+ template<typename T> bool is_readonly_vector_input(uint index, StringRef name) const;
+ bool is_readonly_vector_input(uint index, StringRef name) const;
+
+ template<typename T> bool is_vector_output(uint index, StringRef name) const;
+ bool is_vector_output(uint index, StringRef name);
+
+ bool is_mutable_vector(uint index, StringRef name) const;
+ };
+
class Params {
public:
- template<typename T> ArrayOrSingleRef<T> readonly_single_input(uint index, StringRef name);
- GenericArrayOrSingleRef readonly_single_input(uint index, StringRef name);
+ template<typename T> ArrayOrSingleRef<T> readonly_single_input(uint index, StringRef name)
+ {
+ BLI_assert(m_signature.is_readonly_single_input<T>(index, name));
+ return this->readonly_single_input(index, name).as_typed_ref<T>();
+ }
+ GenericArrayOrSingleRef readonly_single_input(uint index, StringRef name)
+ {
+ BLI_assert(m_signature.is_readonly_single_input(index, name));
+ uint corrected_index = m_signature.get_corrected_index(index);
+ return m_array_or_single_refs[corrected_index];
+ }
- template<typename T> MutableArrayRef<T> single_output(uint index, StringRef name);
- GenericMutableArrayRef single_output(uint index, StringRef name);
+ template<typename T> MutableArrayRef<T> single_output(uint index, StringRef name)
+ {
+ BLI_assert(m_signature.is_single_output<T>(index, name));
+ return this->single_output(index, name).get_ref<T>();
+ }
+ GenericMutableArrayRef single_output(uint index, StringRef name)
+ {
+ BLI_assert(m_signature.is_single_output(index, name));
+ uint corrected_index = m_signature.get_corrected_index(index);
+ return m_mutable_array_refs[corrected_index];
+ }
template<typename T>
const GenericVectorArrayOrSingleRef::TypedRef<T> readonly_vector_input(uint index,
- StringRef name);
- GenericVectorArrayOrSingleRef readonly_vector_input(uint index, StringRef name);
+ StringRef name)
+ {
+ BLI_assert(m_signature.is_readonly_vector_input<T>(index, name));
+ return this->readonly_vector_input(index, name).as_typed_ref<T>();
+ }
+ GenericVectorArrayOrSingleRef readonly_vector_input(uint index, StringRef name)
+ {
+ BLI_assert(m_signature.is_readonly_vector_input(index, name));
+ uint corrected_index = m_signature.get_corrected_index(index);
+ return m_vector_array_or_single_refs[corrected_index];
+ }
template<typename T>
- GenericVectorArray::MutableTypedRef<T> vector_output(uint index, StringRef name);
- GenericVectorArray &vector_output(uint index, StringRef name);
+ GenericVectorArray::MutableTypedRef<T> vector_output(uint index, StringRef name)
+ {
+ BLI_assert(m_signature.is_vector_output<T>(index, name));
+ return this->vector_output(index, name).as_mutable_typed_ref<T>();
+ }
+ GenericVectorArray &vector_output(uint index, StringRef name)
+ {
+ BLI_assert(m_signature.is_vector_output(index, name));
+ uint corrected_index = m_signature.get_corrected_index(index);
+ return *m_vector_arrays[corrected_index];
+ }
+
+ GenericVectorArray &mutable_vector(uint index, StringRef name)
+ {
+ BLI_assert(m_signature.is_mutable_vector(index, name));
+ uint corrected_index = m_signature.get_corrected_index(index);
+ return *m_vector_arrays[corrected_index];
+ }
- GenericVectorArray &mutable_vector(uint index, StringRef name);
+ private:
+ ArrayRef<GenericArrayOrSingleRef> m_array_or_single_refs;
+ ArrayRef<GenericMutableArrayRef> m_mutable_array_refs;
+ ArrayRef<GenericVectorArrayOrSingleRef> m_vector_array_or_single_refs;
+ ArrayRef<GenericVectorArray *> m_vector_arrays;
+ Signature &m_signature;
};
- virtual void signature(Signature &signature) const = 0;
+ virtual void signature(SignatureBuilder &signature) const = 0;
virtual void call(ArrayRef<uint> mask_indices, Params ¶ms) const = 0;
};
diff --git a/source/blender/blenkernel/intern/BKE_multi_functions.h b/source/blender/blenkernel/intern/BKE_multi_functions.h
index 0951501dcd4..5b0ad434639 100644
--- a/source/blender/blenkernel/intern/BKE_multi_functions.h
+++ b/source/blender/blenkernel/intern/BKE_multi_functions.h
@@ -6,22 +6,22 @@
namespace BKE {
class MultiFunction_AddFloats final : public MultiFunction {
- void signature(Signature &signature) const override;
+ void signature(SignatureBuilder &signature) const override;
void call(ArrayRef<uint> mask_indices, Params ¶ms) const override;
};
class MultiFunction_VectorDistance final : public MultiFunction {
- void signature(Signature &signature) const override;
+ void signature(SignatureBuilder &signature) const override;
void call(ArrayRef<uint> mask_indices, Params ¶ms) const override;
};
class MultiFunction_FloatArraySum final : public MultiFunction {
- void signature(Signature &signature) const override;
+ void signature(SignatureBuilder &signature) const override;
void call(ArrayRef<uint> mask_indices, Params ¶ms) const override;
};
class MultiFunction_FloatRange final : public MultiFunction {
- void signature(Signature &signature) const override;
+ void signature(SignatureBuilder &signature) const override;
void call(ArrayRef<uint> mask_indices, Params ¶ms) const override;
};
@@ -30,7 +30,7 @@ class MultiFunction_AppendToList final : public MultiFunction {
CPPType &m_base_type;
public:
- void signature(Signature &signature) const override;
+ void signature(SignatureBuilder &signature) const override;
void call(ArrayRef<uint> mask_indices, Params ¶ms) const override;
};
@@ -39,7 +39,7 @@ class MultiFunction_GetListElement final : public MultiFunction {
CPPType &m_base_type;
public:
- void signature(Signature &signature) const override;
+ void signature(SignatureBuilder &signature) const override;
void call(ArrayRef<uint> mask_indices, Params ¶ms) const override;
};
@@ -48,7 +48,7 @@ class MultiFunction_ListLength final : public MultiFunction {
CPPType &m_base_type;
public:
- void signature(Signature &signature) const override;
+ void signature(SignatureBuilder &signature) const override;
void call(ArrayRef<uint> mask_indices, Params ¶ms) const override;
};
@@ -57,7 +57,7 @@ class MultiFunction_CombineLists final : public MultiFunction {
CPPType &m_base_type;
public:
- void signature(Signature &signature) const override;
+ void signature(SignatureBuilder &signature) const override;
void call(ArrayRef<uint> mask_indices, Params ¶ms) const override;
};
diff --git a/source/blender/blenkernel/intern/multi_functions.cc b/source/blender/blenkernel/intern/multi_functions.cc
index 20e14d28b0d..488768755a5 100644
--- a/source/blender/blenkernel/intern/multi_functions.cc
+++ b/source/blender/blenkernel/intern/multi_functions.cc
@@ -12,7 +12,7 @@ namespace BKE {
using BLI::ArrayOrSingleRef;
using BLI::float3;
-void MultiFunction_AddFloats::signature(Signature &signature) const
+void MultiFunction_AddFloats::signature(SignatureBuilder &signature) const
{
signature.readonly_single_input<float>("A");
signature.readonly_single_input<float>("B");
@@ -30,7 +30,7 @@ void MultiFunction_AddFloats::call(ArrayRef<uint> mask_indices, Params ¶ms)
}
}
-void MultiFunction_VectorDistance::signature(Signature &signature) const
+void MultiFunction_VectorDistance::signature(SignatureBuilder &signature) const
{
signature.readonly_single_input<float3>("A");
signature.readonly_single_input<float3>("A");
@@ -48,7 +48,7 @@ void MultiFunction_VectorDistance::call(ArrayRef<uint> mask_indices, Params &par
}
}
-void MultiFunction_FloatArraySum::signature(Signature &signature) const
+void MultiFunction_FloatArraySum::signature(SignatureBuilder &signature) const
{
signature.readonly_vector_input<float>("Array");
signature.single_output<float>("Sum");
@@ -68,7 +68,7 @@ void MultiFunction_FloatArraySum::call(ArrayRef<uint> mask_indices, Params ¶
}
}
-void MultiFunction_FloatRange::signature(Signature &signature) const
+voi
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list