diff options
| author | Rémi Verschelde <rverschelde@gmail.com> | 2023-01-30 12:07:15 +0100 |
|---|---|---|
| committer | Rémi Verschelde <rverschelde@gmail.com> | 2023-01-30 12:07:15 +0100 |
| commit | 2ef10f9754208f5a7fd388e6928d8fc00b9f97fd (patch) | |
| tree | 628f04aa58de52690b826a4e4ce0968e14b66a15 /include/godot_cpp/core | |
| parent | 0f3a0913f100dcd988b538582431d064f46c4e17 (diff) | |
| parent | 6528c7177fa96bfcc81805e97a0a03290816cb51 (diff) | |
| download | redot-cpp-2ef10f9754208f5a7fd388e6928d8fc00b9f97fd.tar.gz | |
Merge pull request #956 from DmitriySalnikov/enum_bitfield_cast
Fixed `VARIANT_ENUM/BITFIELD_CAST` to show the correct names
Diffstat (limited to 'include/godot_cpp/core')
| -rw-r--r-- | include/godot_cpp/core/binder_common.hpp | 76 | ||||
| -rw-r--r-- | include/godot_cpp/core/type_info.hpp | 52 |
2 files changed, 69 insertions, 59 deletions
diff --git a/include/godot_cpp/core/binder_common.hpp b/include/godot_cpp/core/binder_common.hpp index c96498f..ed7c487 100644 --- a/include/godot_cpp/core/binder_common.hpp +++ b/include/godot_cpp/core/binder_common.hpp @@ -41,46 +41,46 @@ namespace godot { -#define VARIANT_ENUM_CAST(m_class, m_enum) \ - namespace godot { \ - MAKE_ENUM_TYPE_INFO(m_class, m_enum) \ - template <> \ - struct VariantCaster<m_class::m_enum> { \ - static _FORCE_INLINE_ m_class::m_enum cast(const Variant &p_variant) { \ - return (m_class::m_enum)p_variant.operator int64_t(); \ - } \ - }; \ - template <> \ - struct PtrToArg<m_class::m_enum> { \ - _FORCE_INLINE_ static m_class::m_enum convert(const void *p_ptr) { \ - return m_class::m_enum(*reinterpret_cast<const int64_t *>(p_ptr)); \ - } \ - typedef int64_t EncodeT; \ - _FORCE_INLINE_ static void encode(m_class::m_enum p_val, void *p_ptr) { \ - *reinterpret_cast<int64_t *>(p_ptr) = p_val; \ - } \ - }; \ +#define VARIANT_ENUM_CAST(m_enum) \ + namespace godot { \ + MAKE_ENUM_TYPE_INFO(m_enum) \ + template <> \ + struct VariantCaster<m_enum> { \ + static _FORCE_INLINE_ m_enum cast(const Variant &p_variant) { \ + return (m_enum)p_variant.operator int64_t(); \ + } \ + }; \ + template <> \ + struct PtrToArg<m_enum> { \ + _FORCE_INLINE_ static m_enum convert(const void *p_ptr) { \ + return m_enum(*reinterpret_cast<const int64_t *>(p_ptr)); \ + } \ + typedef int64_t EncodeT; \ + _FORCE_INLINE_ static void encode(m_enum p_val, void *p_ptr) { \ + *reinterpret_cast<int64_t *>(p_ptr) = p_val; \ + } \ + }; \ } -#define VARIANT_BITFIELD_CAST(m_class, m_enum) \ - namespace godot { \ - MAKE_BITFIELD_TYPE_INFO(m_class, m_enum) \ - template <> \ - struct VariantCaster<BitField<m_class::m_enum>> { \ - static _FORCE_INLINE_ BitField<m_class::m_enum> cast(const Variant &p_variant) { \ - return BitField<m_class::m_enum>(p_variant.operator int64_t()); \ - } \ - }; \ - template <> \ - struct PtrToArg<BitField<m_class::m_enum>> { \ - _FORCE_INLINE_ static BitField<m_class::m_enum> convert(const void *p_ptr) { \ - return BitField<m_class::m_enum>(*reinterpret_cast<const int64_t *>(p_ptr)); \ - } \ - typedef int64_t EncodeT; \ - _FORCE_INLINE_ static void encode(BitField<m_class::m_enum> p_val, void *p_ptr) { \ - *reinterpret_cast<int64_t *>(p_ptr) = p_val; \ - } \ - }; \ +#define VARIANT_BITFIELD_CAST(m_enum) \ + namespace godot { \ + MAKE_BITFIELD_TYPE_INFO(m_enum) \ + template <> \ + struct VariantCaster<BitField<m_enum>> { \ + static _FORCE_INLINE_ BitField<m_enum> cast(const Variant &p_variant) { \ + return BitField<m_enum>(p_variant.operator int64_t()); \ + } \ + }; \ + template <> \ + struct PtrToArg<BitField<m_enum>> { \ + _FORCE_INLINE_ static BitField<m_enum> convert(const void *p_ptr) { \ + return BitField<m_enum>(*reinterpret_cast<const int64_t *>(p_ptr)); \ + } \ + typedef int64_t EncodeT; \ + _FORCE_INLINE_ static void encode(BitField<m_enum> p_val, void *p_ptr) { \ + *reinterpret_cast<int64_t *>(p_ptr) = p_val; \ + } \ + }; \ } template <class T> diff --git a/include/godot_cpp/core/type_info.hpp b/include/godot_cpp/core/type_info.hpp index 509bfb7..039cb2e 100644 --- a/include/godot_cpp/core/type_info.hpp +++ b/include/godot_cpp/core/type_info.hpp @@ -214,21 +214,31 @@ struct GetTypeInfo<const T *, typename EnableIf<TypeInherits<Object, T>::value>: } }; -#define TEMPL_MAKE_ENUM_TYPE_INFO(m_class, m_enum, m_impl) \ - template <> \ - struct GetTypeInfo<m_impl> { \ - static const Variant::Type VARIANT_TYPE = Variant::INT; \ - static const GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE; \ - static inline PropertyInfo get_class_info() { \ - return make_property_info(Variant::Type::INT, "", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_CLASS_IS_ENUM, #m_class "." #m_enum); \ - } \ +inline String enum_qualified_name_to_class_info_name(const String &p_qualified_name) { + PackedStringArray parts = p_qualified_name.split("::", false); + if (parts.size() <= 2) { + return String(".").join(parts); + } + // Contains namespace. We only want the class and enum names. + return parts[parts.size() - 2] + "." + parts[parts.size() - 1]; +} + +#define TEMPL_MAKE_ENUM_TYPE_INFO(m_enum, m_impl) \ + template <> \ + struct GetTypeInfo<m_impl> { \ + static const Variant::Type VARIANT_TYPE = Variant::INT; \ + static const GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE; \ + static inline PropertyInfo get_class_info() { \ + return make_property_info(Variant::Type::INT, "", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_CLASS_IS_ENUM, \ + enum_qualified_name_to_class_info_name(#m_enum)); \ + } \ }; -#define MAKE_ENUM_TYPE_INFO(m_class, m_enum) \ - TEMPL_MAKE_ENUM_TYPE_INFO(m_class, m_enum, m_class::m_enum) \ - TEMPL_MAKE_ENUM_TYPE_INFO(m_class, m_enum, m_class::m_enum const) \ - TEMPL_MAKE_ENUM_TYPE_INFO(m_class, m_enum, m_class::m_enum &) \ - TEMPL_MAKE_ENUM_TYPE_INFO(m_class, m_enum, const m_class::m_enum &) +#define MAKE_ENUM_TYPE_INFO(m_enum) \ + TEMPL_MAKE_ENUM_TYPE_INFO(m_enum, m_enum) \ + TEMPL_MAKE_ENUM_TYPE_INFO(m_enum, m_enum const) \ + TEMPL_MAKE_ENUM_TYPE_INFO(m_enum, m_enum &) \ + TEMPL_MAKE_ENUM_TYPE_INFO(m_enum, const m_enum &) template <typename T> inline StringName __constant_get_enum_name(T param, StringName p_constant) { @@ -251,14 +261,14 @@ public: _FORCE_INLINE_ operator Variant() const { return value; } }; -#define TEMPL_MAKE_BITFIELD_TYPE_INFO(m_class, m_enum, m_impl) \ +#define TEMPL_MAKE_BITFIELD_TYPE_INFO(m_enum, m_impl) \ template <> \ struct GetTypeInfo<m_impl> { \ static const Variant::Type VARIANT_TYPE = Variant::INT; \ static const GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE; \ static inline PropertyInfo get_class_info() { \ return make_property_info(Variant::Type::INT, "", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_CLASS_IS_BITFIELD, \ - #m_class "." #m_enum); \ + enum_qualified_name_to_class_info_name(#m_enum)); \ } \ }; \ template <> \ @@ -267,15 +277,15 @@ public: static const GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE; \ static inline PropertyInfo get_class_info() { \ return make_property_info(Variant::Type::INT, "", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_CLASS_IS_BITFIELD, \ - #m_class "." #m_enum); \ + enum_qualified_name_to_class_info_name(#m_enum)); \ } \ }; -#define MAKE_BITFIELD_TYPE_INFO(m_class, m_enum) \ - TEMPL_MAKE_BITFIELD_TYPE_INFO(m_class, m_enum, m_enum) \ - TEMPL_MAKE_BITFIELD_TYPE_INFO(m_class, m_enum, m_enum const) \ - TEMPL_MAKE_BITFIELD_TYPE_INFO(m_class, m_enum, m_enum &) \ - TEMPL_MAKE_BITFIELD_TYPE_INFO(m_class, m_enum, const m_enum &) +#define MAKE_BITFIELD_TYPE_INFO(m_enum) \ + TEMPL_MAKE_BITFIELD_TYPE_INFO(m_enum, m_enum) \ + TEMPL_MAKE_BITFIELD_TYPE_INFO(m_enum, m_enum const) \ + TEMPL_MAKE_BITFIELD_TYPE_INFO(m_enum, m_enum &) \ + TEMPL_MAKE_BITFIELD_TYPE_INFO(m_enum, const m_enum &) template <typename T> inline StringName __constant_get_bitfield_name(T param, StringName p_constant) { |
