|
@@ -67,43 +67,80 @@ struct TypeInherits {
|
|
|
!TypesAreSame<B volatile const, void volatile const>::value;
|
|
|
};
|
|
|
|
|
|
+namespace GodotTypeInfo {
|
|
|
+enum Metadata {
|
|
|
+ METADATA_NONE,
|
|
|
+ METADATA_INT_IS_INT8,
|
|
|
+ METADATA_INT_IS_INT16,
|
|
|
+ METADATA_INT_IS_INT32,
|
|
|
+ METADATA_INT_IS_INT64,
|
|
|
+ METADATA_INT_IS_UINT8,
|
|
|
+ METADATA_INT_IS_UINT16,
|
|
|
+ METADATA_INT_IS_UINT32,
|
|
|
+ METADATA_INT_IS_UINT64,
|
|
|
+ METADATA_REAL_IS_FLOAT,
|
|
|
+ METADATA_REAL_IS_DOUBLE
|
|
|
+};
|
|
|
+}
|
|
|
+
|
|
|
template <class T, typename = void>
|
|
|
struct GetTypeInfo {
|
|
|
static const Variant::Type VARIANT_TYPE = Variant::NIL;
|
|
|
+ static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE;
|
|
|
static inline PropertyInfo get_class_info() {
|
|
|
ERR_PRINT("GetTypeInfo fallback. Bug!");
|
|
|
return PropertyInfo(); // Not "Nil", this is an error
|
|
|
}
|
|
|
};
|
|
|
|
|
|
-#define MAKE_TYPE_INFO(m_type, m_var_type) \
|
|
|
- template <> \
|
|
|
- struct GetTypeInfo<m_type> { \
|
|
|
- static const Variant::Type VARIANT_TYPE = m_var_type; \
|
|
|
- static inline PropertyInfo get_class_info() { \
|
|
|
- return PropertyInfo(VARIANT_TYPE, String()); \
|
|
|
- } \
|
|
|
- }; \
|
|
|
- template <> \
|
|
|
- struct GetTypeInfo<const m_type &> { \
|
|
|
- static const Variant::Type VARIANT_TYPE = m_var_type; \
|
|
|
- static inline PropertyInfo get_class_info() { \
|
|
|
- return PropertyInfo(VARIANT_TYPE, String()); \
|
|
|
- } \
|
|
|
+#define MAKE_TYPE_INFO(m_type, m_var_type) \
|
|
|
+ template <> \
|
|
|
+ struct GetTypeInfo<m_type> { \
|
|
|
+ static const Variant::Type VARIANT_TYPE = m_var_type; \
|
|
|
+ static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; \
|
|
|
+ static inline PropertyInfo get_class_info() { \
|
|
|
+ return PropertyInfo(VARIANT_TYPE, String()); \
|
|
|
+ } \
|
|
|
+ }; \
|
|
|
+ template <> \
|
|
|
+ struct GetTypeInfo<const m_type &> { \
|
|
|
+ static const Variant::Type VARIANT_TYPE = m_var_type; \
|
|
|
+ static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; \
|
|
|
+ static inline PropertyInfo get_class_info() { \
|
|
|
+ return PropertyInfo(VARIANT_TYPE, String()); \
|
|
|
+ } \
|
|
|
+ };
|
|
|
+
|
|
|
+#define MAKE_TYPE_INFO_WITH_META(m_type, m_var_type, m_metadata) \
|
|
|
+ template <> \
|
|
|
+ struct GetTypeInfo<m_type> { \
|
|
|
+ static const Variant::Type VARIANT_TYPE = m_var_type; \
|
|
|
+ static const GodotTypeInfo::Metadata METADATA = m_metadata; \
|
|
|
+ static inline PropertyInfo get_class_info() { \
|
|
|
+ return PropertyInfo(VARIANT_TYPE, String()); \
|
|
|
+ } \
|
|
|
+ }; \
|
|
|
+ template <> \
|
|
|
+ struct GetTypeInfo<const m_type &> { \
|
|
|
+ static const Variant::Type VARIANT_TYPE = m_var_type; \
|
|
|
+ static const GodotTypeInfo::Metadata METADATA = m_metadata; \
|
|
|
+ static inline PropertyInfo get_class_info() { \
|
|
|
+ return PropertyInfo(VARIANT_TYPE, String()); \
|
|
|
+ } \
|
|
|
};
|
|
|
|
|
|
MAKE_TYPE_INFO(bool, Variant::BOOL)
|
|
|
-MAKE_TYPE_INFO(uint8_t, Variant::INT)
|
|
|
-MAKE_TYPE_INFO(int8_t, Variant::INT)
|
|
|
-MAKE_TYPE_INFO(uint16_t, Variant::INT)
|
|
|
-MAKE_TYPE_INFO(int16_t, Variant::INT)
|
|
|
-MAKE_TYPE_INFO(uint32_t, Variant::INT)
|
|
|
-MAKE_TYPE_INFO(int32_t, Variant::INT)
|
|
|
-MAKE_TYPE_INFO(int64_t, Variant::INT)
|
|
|
-MAKE_TYPE_INFO(uint64_t, Variant::INT)
|
|
|
+MAKE_TYPE_INFO_WITH_META(uint8_t, Variant::INT, GodotTypeInfo::METADATA_INT_IS_UINT8)
|
|
|
+MAKE_TYPE_INFO_WITH_META(int8_t, Variant::INT, GodotTypeInfo::METADATA_INT_IS_INT8)
|
|
|
+MAKE_TYPE_INFO_WITH_META(uint16_t, Variant::INT, GodotTypeInfo::METADATA_INT_IS_UINT16)
|
|
|
+MAKE_TYPE_INFO_WITH_META(int16_t, Variant::INT, GodotTypeInfo::METADATA_INT_IS_INT16)
|
|
|
+MAKE_TYPE_INFO_WITH_META(uint32_t, Variant::INT, GodotTypeInfo::METADATA_INT_IS_UINT32)
|
|
|
+MAKE_TYPE_INFO_WITH_META(int32_t, Variant::INT, GodotTypeInfo::METADATA_INT_IS_INT32)
|
|
|
+MAKE_TYPE_INFO_WITH_META(uint64_t, Variant::INT, GodotTypeInfo::METADATA_INT_IS_UINT64)
|
|
|
+MAKE_TYPE_INFO_WITH_META(int64_t, Variant::INT, GodotTypeInfo::METADATA_INT_IS_INT64)
|
|
|
MAKE_TYPE_INFO(wchar_t, Variant::INT)
|
|
|
-MAKE_TYPE_INFO(float, Variant::REAL)
|
|
|
-MAKE_TYPE_INFO(double, Variant::REAL)
|
|
|
+MAKE_TYPE_INFO_WITH_META(float, Variant::REAL, GodotTypeInfo::METADATA_REAL_IS_FLOAT)
|
|
|
+MAKE_TYPE_INFO_WITH_META(double, Variant::REAL, GodotTypeInfo::METADATA_REAL_IS_DOUBLE)
|
|
|
|
|
|
MAKE_TYPE_INFO(String, Variant::STRING)
|
|
|
MAKE_TYPE_INFO(Vector2, Variant::VECTOR2)
|
|
@@ -138,6 +175,7 @@ MAKE_TYPE_INFO(BSP_Tree, Variant::DICTIONARY)
|
|
|
template <>
|
|
|
struct GetTypeInfo<RefPtr> {
|
|
|
static const Variant::Type VARIANT_TYPE = Variant::OBJECT;
|
|
|
+ static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE;
|
|
|
static inline PropertyInfo get_class_info() {
|
|
|
return PropertyInfo(Variant::OBJECT, String(), PROPERTY_HINT_RESOURCE_TYPE, "Reference");
|
|
|
}
|
|
@@ -145,6 +183,7 @@ struct GetTypeInfo<RefPtr> {
|
|
|
template <>
|
|
|
struct GetTypeInfo<const RefPtr &> {
|
|
|
static const Variant::Type VARIANT_TYPE = Variant::OBJECT;
|
|
|
+ static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE;
|
|
|
static inline PropertyInfo get_class_info() {
|
|
|
return PropertyInfo(Variant::OBJECT, String(), PROPERTY_HINT_RESOURCE_TYPE, "Reference");
|
|
|
}
|
|
@@ -154,6 +193,7 @@ struct GetTypeInfo<const RefPtr &> {
|
|
|
template <>
|
|
|
struct GetTypeInfo<Variant> {
|
|
|
static const Variant::Type VARIANT_TYPE = Variant::NIL;
|
|
|
+ static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE;
|
|
|
static inline PropertyInfo get_class_info() {
|
|
|
return PropertyInfo(Variant::NIL, String(), PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_NIL_IS_VARIANT);
|
|
|
}
|
|
@@ -162,25 +202,28 @@ struct GetTypeInfo<Variant> {
|
|
|
template <>
|
|
|
struct GetTypeInfo<const Variant &> {
|
|
|
static const Variant::Type VARIANT_TYPE = Variant::NIL;
|
|
|
+ static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE;
|
|
|
static inline PropertyInfo get_class_info() {
|
|
|
return PropertyInfo(Variant::NIL, String(), PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_NIL_IS_VARIANT);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
-#define MAKE_TEMPLATE_TYPE_INFO(m_template, m_type, m_var_type) \
|
|
|
- template <> \
|
|
|
- struct GetTypeInfo<m_template<m_type> > { \
|
|
|
- static const Variant::Type VARIANT_TYPE = m_var_type; \
|
|
|
- static inline PropertyInfo get_class_info() { \
|
|
|
- return PropertyInfo(VARIANT_TYPE, String()); \
|
|
|
- } \
|
|
|
- }; \
|
|
|
- template <> \
|
|
|
- struct GetTypeInfo<const m_template<m_type> &> { \
|
|
|
- static const Variant::Type VARIANT_TYPE = m_var_type; \
|
|
|
- static inline PropertyInfo get_class_info() { \
|
|
|
- return PropertyInfo(VARIANT_TYPE, String()); \
|
|
|
- } \
|
|
|
+#define MAKE_TEMPLATE_TYPE_INFO(m_template, m_type, m_var_type) \
|
|
|
+ template <> \
|
|
|
+ struct GetTypeInfo<m_template<m_type> > { \
|
|
|
+ static const Variant::Type VARIANT_TYPE = m_var_type; \
|
|
|
+ static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; \
|
|
|
+ static inline PropertyInfo get_class_info() { \
|
|
|
+ return PropertyInfo(VARIANT_TYPE, String()); \
|
|
|
+ } \
|
|
|
+ }; \
|
|
|
+ template <> \
|
|
|
+ struct GetTypeInfo<const m_template<m_type> &> { \
|
|
|
+ static const Variant::Type VARIANT_TYPE = m_var_type; \
|
|
|
+ static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; \
|
|
|
+ static inline PropertyInfo get_class_info() { \
|
|
|
+ return PropertyInfo(VARIANT_TYPE, String()); \
|
|
|
+ } \
|
|
|
};
|
|
|
|
|
|
MAKE_TEMPLATE_TYPE_INFO(Vector, uint8_t, Variant::POOL_BYTE_ARRAY)
|
|
@@ -202,6 +245,7 @@ MAKE_TEMPLATE_TYPE_INFO(PoolVector, Face3, Variant::POOL_VECTOR3_ARRAY)
|
|
|
template <typename T>
|
|
|
struct GetTypeInfo<T *, typename EnableIf<TypeInherits<Object, T>::value>::type> {
|
|
|
static const Variant::Type VARIANT_TYPE = Variant::OBJECT;
|
|
|
+ static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE;
|
|
|
static inline PropertyInfo get_class_info() {
|
|
|
return PropertyInfo(StringName(T::get_class_static()));
|
|
|
}
|
|
@@ -210,6 +254,7 @@ struct GetTypeInfo<T *, typename EnableIf<TypeInherits<Object, T>::value>::type>
|
|
|
template <typename T>
|
|
|
struct GetTypeInfo<const T *, typename EnableIf<TypeInherits<Object, T>::value>::type> {
|
|
|
static const Variant::Type VARIANT_TYPE = Variant::OBJECT;
|
|
|
+ static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE;
|
|
|
static inline PropertyInfo get_class_info() {
|
|
|
return PropertyInfo(StringName(T::get_class_static()));
|
|
|
}
|
|
@@ -219,6 +264,7 @@ struct GetTypeInfo<const T *, typename EnableIf<TypeInherits<Object, T>::value>:
|
|
|
template <> \
|
|
|
struct GetTypeInfo<m_impl> { \
|
|
|
static const Variant::Type VARIANT_TYPE = Variant::INT; \
|
|
|
+ static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; \
|
|
|
static inline PropertyInfo get_class_info() { \
|
|
|
return PropertyInfo(Variant::INT, String(), PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_CLASS_IS_ENUM, String(#m_enum).replace("::", ".")); \
|
|
|
} \
|