[Bf-blender-cvs] [dde42e19e39] temp-geometry-nodes-fields-prototype: support cpptype inheritance for templates

Jacques Lucke noreply at git.blender.org
Wed Jul 28 14:14:24 CEST 2021


Commit: dde42e19e39d9b4fec382a0e2249eca10b87c86f
Author: Jacques Lucke
Date:   Wed Jul 28 13:37:29 2021 +0200
Branches: temp-geometry-nodes-fields-prototype
https://developer.blender.org/rBdde42e19e39d9b4fec382a0e2249eca10b87c86f

support cpptype inheritance for templates

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

M	source/blender/blenkernel/BKE_field.hh
M	source/blender/functions/FN_cpp_type.hh
M	source/blender/functions/FN_cpp_type_make.hh
M	source/blender/modifiers/intern/MOD_nodes_evaluator.cc

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

diff --git a/source/blender/blenkernel/BKE_field.hh b/source/blender/blenkernel/BKE_field.hh
index 58800acba71..fa3f06da402 100644
--- a/source/blender/blenkernel/BKE_field.hh
+++ b/source/blender/blenkernel/BKE_field.hh
@@ -30,6 +30,7 @@
 #include "BLI_virtual_array.hh"
 
 #include "FN_cpp_type.hh"
+#include "FN_cpp_type_make.hh"
 #include "FN_multi_function.hh"
 
 namespace blender::bke {
@@ -394,4 +395,31 @@ template<typename T> class FieldRef : public FieldRefBase {
   }
 };
 
+class FieldRefCPPType : public CPPType {
+ private:
+  const CPPType &type_;
+
+ public:
+  FieldRefCPPType(fn::CPPTypeMembers members, const CPPType &base_type)
+      : CPPType(members), type_(base_type)
+  {
+  }
+
+  const CPPType &type() const
+  {
+    return type_;
+  };
+};
+
 }  // namespace blender::bke
+
+#define MAKE_FIELD_REF_CPP_TYPE(DEBUG_NAME, BASE_TYPE) \
+  template<> \
+  const blender::fn::CPPType &blender::fn::CPPType::get_impl<blender::bke::FieldRef<BASE_TYPE>>() \
+  { \
+    static blender::bke::FieldRefCPPType cpp_type{ \
+        blender::fn::create_cpp_type_members<blender::bke::FieldRef<BASE_TYPE>, \
+                                             CPPTypeFlags::BasicType>(#DEBUG_NAME), \
+        blender::fn::CPPType::get<BASE_TYPE>()}; \
+    return cpp_type; \
+  }
diff --git a/source/blender/functions/FN_cpp_type.hh b/source/blender/functions/FN_cpp_type.hh
index bc3f398c8e9..4376dcbc34c 100644
--- a/source/blender/functions/FN_cpp_type.hh
+++ b/source/blender/functions/FN_cpp_type.hh
@@ -129,6 +129,8 @@ class CPPType : NonCopyable, NonMovable {
                                        m_.destruct);
   }
 
+  virtual ~CPPType() = default;
+
   /**
    * Two types only compare equal when their pointer is equal. No two instances of CPPType for the
    * same C++ type should be created.
@@ -148,7 +150,11 @@ class CPPType : NonCopyable, NonMovable {
    * This only works for types that actually implement the template specialization using
    * `MAKE_CPP_TYPE`.
    */
-  template<typename T> static const CPPType &get();
+  template<typename T> static const CPPType &get()
+  {
+    return CPPType::get_impl<std::remove_cv_t<T>>();
+  }
+  template<typename T> static const CPPType &get_impl();
 
   /**
    * Returns the name of the type for debugging purposes. This name should not be used as
diff --git a/source/blender/functions/FN_cpp_type_make.hh b/source/blender/functions/FN_cpp_type_make.hh
index b8e5373ccf7..b425279d48d 100644
--- a/source/blender/functions/FN_cpp_type_make.hh
+++ b/source/blender/functions/FN_cpp_type_make.hh
@@ -203,12 +203,12 @@ ENUM_OPERATORS(CPPTypeFlags, CPPTypeFlags::EqualityComparable)
 namespace blender::fn {
 
 template<typename T, CPPTypeFlags flags>
-inline std::unique_ptr<const CPPType> create_cpp_type(StringRef name)
+inline CPPTypeMembers create_cpp_type_members(std::string debug_name)
 {
   using namespace cpp_type_util;
 
   CPPTypeMembers m;
-  m.name = name;
+  m.name = std::move(debug_name);
   m.size = (int64_t)sizeof(T);
   m.alignment = (int64_t)alignof(T);
   m.is_trivially_destructible = std::is_trivially_destructible_v<T>;
@@ -263,22 +263,24 @@ inline std::unique_ptr<const CPPType> create_cpp_type(StringRef name)
   if constexpr ((bool)(flags & CPPTypeFlags::EqualityComparable)) {
     m.is_equal = is_equal_cb<T>;
   }
-
-  const CPPType *type = new CPPType(std::move(m));
-  return std::unique_ptr<const CPPType>(type);
+  return m;
 }
 
+class StandardCPPType : public CPPType {
+ public:
+  template<typename T, CPPTypeFlags flags>
+  StandardCPPType(std::string debug_name)
+      : CPPType(create_cpp_type_members<T, flags>(std::move(debug_name)))
+  {
+  }
+};
+
 }  // namespace blender::fn
 
-#define MAKE_CPP_TYPE(IDENTIFIER, TYPE_NAME, FLAGS) \
-  template<> const blender::fn::CPPType &blender::fn::CPPType::get<TYPE_NAME>() \
-  { \
-    static std::unique_ptr<const CPPType> cpp_type = \
-        blender::fn::create_cpp_type<TYPE_NAME, FLAGS>(STRINGIFY(IDENTIFIER)); \
-    return *cpp_type; \
-  } \
-  /* Support using `CPPType::get<const T>()`. Otherwise the caller would have to remove const. */ \
-  template<> const blender::fn::CPPType &blender::fn::CPPType::get<const TYPE_NAME>() \
+#define MAKE_CPP_TYPE(DEBUG_NAME, TYPE_NAME, FLAGS) \
+  template<> const blender::fn::CPPType &blender::fn::CPPType::get_impl<TYPE_NAME>() \
   { \
-    return blender::fn::CPPType::get<TYPE_NAME>(); \
+    static blender::fn::CPPType cpp_type{ \
+        blender::fn::create_cpp_type_members<TYPE_NAME, FLAGS>(#DEBUG_NAME)}; \
+    return cpp_type; \
   }
diff --git a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
index 9d9744b625c..ebe92a53381 100644
--- a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
+++ b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
@@ -31,13 +31,11 @@
 #include "BLI_task.hh"
 #include "BLI_vector_set.hh"
 
-MAKE_CPP_TYPE(FloatFieldRef, blender::bke::FieldRef<float>, CPPTypeFlags::BasicType);
-MAKE_CPP_TYPE(IntFieldRef, blender::bke::FieldRef<int>, CPPTypeFlags::BasicType);
-MAKE_CPP_TYPE(BoolFieldRef, blender::bke::FieldRef<bool>, CPPTypeFlags::BasicType);
-MAKE_CPP_TYPE(Float3FieldRef, blender::bke::FieldRef<blender::float3>, CPPTypeFlags::BasicType);
-MAKE_CPP_TYPE(ColorFieldRef,
-              blender::bke::FieldRef<blender::ColorGeometry4f>,
-              CPPTypeFlags::BasicType);
+MAKE_FIELD_REF_CPP_TYPE(FloatFieldRef, float)
+MAKE_FIELD_REF_CPP_TYPE(IntFieldRef, int)
+MAKE_FIELD_REF_CPP_TYPE(BoolFieldRef, bool)
+MAKE_FIELD_REF_CPP_TYPE(Float3FieldRef, blender::float3)
+MAKE_FIELD_REF_CPP_TYPE(ColorFieldRef, blender::ColorGeometry4f)
 
 namespace blender::modifiers::geometry_nodes {



More information about the Bf-blender-cvs mailing list