[Bf-blender-cvs] [78aa2d5f026] functions-experimental-refactor: further implement signature builder

Jacques Lucke noreply at git.blender.org
Tue Oct 15 15:57:30 CEST 2019


Commit: 78aa2d5f026100c9a3c3f97050ee4adb2795f7cf
Author: Jacques Lucke
Date:   Sun Oct 13 16:17:19 2019 +0200
Branches: functions-experimental-refactor
https://developer.blender.org/rB78aa2d5f026100c9a3c3f97050ee4adb2795f7cf

further implement signature builder

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

M	source/blender/blenkernel/BKE_multi_function.h

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

diff --git a/source/blender/blenkernel/BKE_multi_function.h b/source/blender/blenkernel/BKE_multi_function.h
index c2cc848cfa3..6268f5ff48a 100644
--- a/source/blender/blenkernel/BKE_multi_function.h
+++ b/source/blender/blenkernel/BKE_multi_function.h
@@ -12,39 +12,54 @@ using BLI::Vector;
 
 class MultiFunction {
  public:
-  class SignatureBuilder {
-   public:
-    template<typename T> void readonly_single_input(StringRef name);
-    void readonly_single_input(StringRef name, CPPType &type);
-
-    template<typename T> void single_output(StringRef name);
-    void single_output(StringRef name, CPPType &base_type);
-
-    template<typename T> void readonly_vector_input(StringRef name);
-    void readonly_vector_input(StringRef name, CPPType &base_type);
-
-    template<typename T> void vector_output(StringRef name);
-    void vector_output(StringRef name, CPPType &base_type);
-
-    void mutable_vector(StringRef name, CPPType &base_type);
+  enum ParamCategory {
+    SingleInput,
+    SingleOutput,
+    VectorInput,
+    VectorOutput,
+    MutableVector,
   };
 
   class Signature {
    private:
-    enum ParamCategory {
-      SingleInput,
-      SingleOutput,
-      VectorInput,
-      VectorOutput,
-      MutableVector,
-    };
-
-    Vector<uint> m_corrected_indices;
     Vector<std::string> m_param_names;
     Vector<ParamCategory> m_param_categories;
     Vector<CPPType *> m_param_base_types;
+    Vector<uint> m_corrected_indices;
 
    public:
+    Signature(Vector<std::string> param_names,
+              Vector<ParamCategory> param_categories,
+              Vector<CPPType *> param_base_types)
+        : m_param_names(std::move(param_names)),
+          m_param_categories(std::move(param_categories)),
+          m_param_base_types(std::move(param_base_types))
+    {
+      uint array_or_single_refs = 0;
+      uint mutable_array_refs = 0;
+      uint vector_array_or_single_refs = 0;
+      uint vector_arrays = 0;
+      for (ParamCategory category : param_categories) {
+        uint corrected_index;
+        switch (category) {
+          case ParamCategory::SingleInput:
+            corrected_index = array_or_single_refs++;
+            break;
+          case ParamCategory::SingleOutput:
+            corrected_index = mutable_array_refs++;
+            break;
+          case ParamCategory::VectorInput:
+            corrected_index = vector_array_or_single_refs++;
+            break;
+          case ParamCategory::VectorOutput:
+          case ParamCategory::MutableVector:
+            corrected_index = vector_arrays++;
+            break;
+        }
+        m_corrected_indices.append(corrected_index);
+      }
+    }
+
     uint get_corrected_index(uint index) const
     {
       return m_corrected_indices[index];
@@ -105,6 +120,71 @@ class MultiFunction {
     }
   };
 
+  class SignatureBuilder {
+   private:
+    Vector<std::string> m_param_names;
+    Vector<ParamCategory> m_param_categories;
+    Vector<CPPType *> m_param_base_types;
+
+   public:
+    template<typename T> void readonly_single_input(StringRef name)
+    {
+      this->readonly_single_input(name, GET_TYPE<T>());
+    }
+    void readonly_single_input(StringRef name, CPPType &type)
+    {
+      m_param_names.append(name);
+      m_param_base_types.append(&type);
+      m_param_categories.append(ParamCategory::SingleInput);
+    }
+
+    template<typename T> void single_output(StringRef name)
+    {
+      this->single_output(name, GET_TYPE<T>());
+    }
+    void single_output(StringRef name, CPPType &type)
+    {
+      m_param_names.append(name);
+      m_param_base_types.append(&type);
+      m_param_categories.append(ParamCategory::SingleOutput);
+    }
+
+    template<typename T> void readonly_vector_input(StringRef name)
+    {
+      this->readonly_vector_input(name, GET_TYPE<T>());
+    }
+    void readonly_vector_input(StringRef name, CPPType &base_type)
+    {
+      m_param_names.append(name);
+      m_param_base_types.append(&base_type);
+      m_param_categories.append(ParamCategory::VectorInput);
+    }
+
+    template<typename T> void vector_output(StringRef name)
+    {
+      this->vector_output(name, GET_TYPE<T>());
+    }
+    void vector_output(StringRef name, CPPType &base_type)
+    {
+      m_param_names.append(name);
+      m_param_base_types.append(&base_type);
+      m_param_categories.append(ParamCategory::VectorOutput);
+    }
+
+    void mutable_vector(StringRef name, CPPType &base_type)
+    {
+      m_param_names.append(name);
+      m_param_base_types.append(&base_type);
+      m_param_categories.append(ParamCategory::MutableVector);
+    }
+
+    Signature build()
+    {
+      return Signature(
+          std::move(m_param_names), std::move(m_param_categories), std::move(m_param_base_types));
+    }
+  };
+
   class Params {
    public:
     template<typename T> ArrayOrSingleRef<T> readonly_single_input(uint index, StringRef name)



More information about the Bf-blender-cvs mailing list