[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