[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 &params) 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 &params) 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 &params) 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 &params) 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 &params) 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 &params) 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 &params) 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 &params) 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 &params) 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 &params)
   }
 }
 
-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 &para
   }
 }
 
-void MultiFunction_FloatRange::signature(Signature &signature) const
+voi

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list