diff --git a/core/variant/variant.h b/core/variant/variant.h index e87bb6c5544..8dbac106120 100644 --- a/core/variant/variant.h +++ b/core/variant/variant.h @@ -173,6 +173,12 @@ private: friend struct _VariantCall; friend class VariantInternal; + template + friend struct _VariantGetInternalPtrLocal; + template + friend struct _VariantGetInternalPtrElsewhere; + template + friend struct _VariantGetInternalPtrPackedArrayRef; // Variant takes 24 bytes when real_t is float, and 40 bytes if double. // It only allocates extra memory for AABB/Transform2D (24, 48 if double), // Basis/Transform3D (48, 96 if double), Projection (64, 128 if double), diff --git a/core/variant/variant_construct.cpp b/core/variant/variant_construct.cpp index 9706457549b..8182055a10d 100644 --- a/core/variant/variant_construct.cpp +++ b/core/variant/variant_construct.cpp @@ -125,8 +125,8 @@ void Variant::_register_variant_constructors() { add_constructor>(sarray()); add_constructor>(sarray("from")); - add_constructor>(sarray("rotation", "position")); - add_constructor>(sarray("rotation", "scale", "skew", "position")); + add_constructor>(sarray("rotation", "position")); + add_constructor>(sarray("rotation", "scale", "skew", "position")); add_constructor>(sarray("x_axis", "y_axis", "origin")); add_constructor>(sarray()); diff --git a/core/variant/variant_internal.h b/core/variant/variant_internal.h index 59eff614559..671e4a00220 100644 --- a/core/variant/variant_internal.h +++ b/core/variant/variant_internal.h @@ -30,6 +30,7 @@ #pragma once +#include "type_info.h" #include "variant.h" #include "core/templates/simple_type.h" @@ -44,6 +45,10 @@ class VariantInternal { public: // Set type. + _FORCE_INLINE_ static void set_type(Variant &v, Variant::Type p_type) { + v.type = p_type; + } + _FORCE_INLINE_ static void initialize(Variant *v, Variant::Type p_type) { v->clear(); v->type = p_type; @@ -529,283 +534,222 @@ public: } }; +/// Types that can be stored in Variant. template struct VariantGetInternalPtr; template struct VariantGetInternalPtr>>> : VariantGetInternalPtr> {}; -template <> -struct VariantGetInternalPtr { - static bool *get_ptr(Variant *v) { return VariantInternal::get_bool(v); } - static const bool *get_ptr(const Variant *v) { return VariantInternal::get_bool(v); } +template +struct _VariantGetInternalPtrLocal { + using type = T; + static constexpr bool is_local = true; + static _FORCE_INLINE_ T *get_ptr(Variant *v) { return reinterpret_cast(v->_data._mem); } + static _FORCE_INLINE_ const T *get_ptr(const Variant *v) { return reinterpret_cast(v->_data._mem); } }; template -struct VariantGetInternalPtr || std::is_enum_v>> { - static int64_t *get_ptr(Variant *v) { return VariantInternal::get_int(v); } - static const int64_t *get_ptr(const Variant *v) { return VariantInternal::get_int(v); } +struct _VariantGetInternalPtrElsewhere { + using type = T; + static constexpr bool is_local = false; + static _FORCE_INLINE_ T *get_ptr(Variant *v) { return reinterpret_cast(v->_data._ptr); } + static _FORCE_INLINE_ const T *get_ptr(const Variant *v) { return reinterpret_cast(v->_data._ptr); } }; template -struct VariantGetInternalPtr, std::enable_if_t>> { - static int64_t *get_ptr(Variant *v) { return VariantInternal::get_int(v); } - static const int64_t *get_ptr(const Variant *v) { return VariantInternal::get_int(v); } +struct _VariantGetInternalPtrPackedArrayRef { + using type = Vector; + static constexpr bool is_local = false; + static _FORCE_INLINE_ Vector *get_ptr(Variant *v) { return &static_cast *>(v->_data.packed_array)->array; } + static _FORCE_INLINE_ const Vector *get_ptr(const Variant *v) { return &static_cast *>(v->_data.packed_array)->array; } }; template <> -struct VariantGetInternalPtr { - static int64_t *get_ptr(Variant *v) { return VariantInternal::get_int(v); } - static const int64_t *get_ptr(const Variant *v) { return VariantInternal::get_int(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrLocal {}; template <> -struct VariantGetInternalPtr { - static double *get_ptr(Variant *v) { return VariantInternal::get_float(v); } - static const double *get_ptr(const Variant *v) { return VariantInternal::get_float(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrLocal {}; template <> -struct VariantGetInternalPtr { - static double *get_ptr(Variant *v) { return VariantInternal::get_float(v); } - static const double *get_ptr(const Variant *v) { return VariantInternal::get_float(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrLocal {}; template <> -struct VariantGetInternalPtr { - static String *get_ptr(Variant *v) { return VariantInternal::get_string(v); } - static const String *get_ptr(const Variant *v) { return VariantInternal::get_string(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrLocal {}; template <> -struct VariantGetInternalPtr { - static Vector2 *get_ptr(Variant *v) { return VariantInternal::get_vector2(v); } - static const Vector2 *get_ptr(const Variant *v) { return VariantInternal::get_vector2(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrLocal {}; template <> -struct VariantGetInternalPtr { - static Vector2i *get_ptr(Variant *v) { return VariantInternal::get_vector2i(v); } - static const Vector2i *get_ptr(const Variant *v) { return VariantInternal::get_vector2i(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrLocal {}; template <> -struct VariantGetInternalPtr { - static Rect2 *get_ptr(Variant *v) { return VariantInternal::get_rect2(v); } - static const Rect2 *get_ptr(const Variant *v) { return VariantInternal::get_rect2(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrLocal {}; template <> -struct VariantGetInternalPtr { - static Rect2i *get_ptr(Variant *v) { return VariantInternal::get_rect2i(v); } - static const Rect2i *get_ptr(const Variant *v) { return VariantInternal::get_rect2i(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrLocal {}; template <> -struct VariantGetInternalPtr { - static Vector3 *get_ptr(Variant *v) { return VariantInternal::get_vector3(v); } - static const Vector3 *get_ptr(const Variant *v) { return VariantInternal::get_vector3(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrLocal {}; template <> -struct VariantGetInternalPtr { - static Vector3i *get_ptr(Variant *v) { return VariantInternal::get_vector3i(v); } - static const Vector3i *get_ptr(const Variant *v) { return VariantInternal::get_vector3i(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrLocal {}; template <> -struct VariantGetInternalPtr { - static Vector4 *get_ptr(Variant *v) { return VariantInternal::get_vector4(v); } - static const Vector4 *get_ptr(const Variant *v) { return VariantInternal::get_vector4(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrLocal {}; template <> -struct VariantGetInternalPtr { - static Vector4i *get_ptr(Variant *v) { return VariantInternal::get_vector4i(v); } - static const Vector4i *get_ptr(const Variant *v) { return VariantInternal::get_vector4i(v); } -}; -template <> -struct VariantGetInternalPtr { - static Transform2D *get_ptr(Variant *v) { return VariantInternal::get_transform2d(v); } - static const Transform2D *get_ptr(const Variant *v) { return VariantInternal::get_transform2d(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrLocal {}; template <> -struct VariantGetInternalPtr { - static Transform3D *get_ptr(Variant *v) { return VariantInternal::get_transform(v); } - static const Transform3D *get_ptr(const Variant *v) { return VariantInternal::get_transform(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrElsewhere {}; template <> -struct VariantGetInternalPtr { - static Projection *get_ptr(Variant *v) { return VariantInternal::get_projection(v); } - static const Projection *get_ptr(const Variant *v) { return VariantInternal::get_projection(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrElsewhere {}; template <> -struct VariantGetInternalPtr { - static Plane *get_ptr(Variant *v) { return VariantInternal::get_plane(v); } - static const Plane *get_ptr(const Variant *v) { return VariantInternal::get_plane(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrElsewhere {}; template <> -struct VariantGetInternalPtr { - static Quaternion *get_ptr(Variant *v) { return VariantInternal::get_quaternion(v); } - static const Quaternion *get_ptr(const Variant *v) { return VariantInternal::get_quaternion(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrLocal {}; template <> -struct VariantGetInternalPtr<::AABB> { - static ::AABB *get_ptr(Variant *v) { return VariantInternal::get_aabb(v); } - static const ::AABB *get_ptr(const Variant *v) { return VariantInternal::get_aabb(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrLocal {}; template <> -struct VariantGetInternalPtr { - static Basis *get_ptr(Variant *v) { return VariantInternal::get_basis(v); } - static const Basis *get_ptr(const Variant *v) { return VariantInternal::get_basis(v); } -}; - -// +struct VariantGetInternalPtr<::AABB> : _VariantGetInternalPtrElsewhere<::AABB> {}; template <> -struct VariantGetInternalPtr { - static Color *get_ptr(Variant *v) { return VariantInternal::get_color(v); } - static const Color *get_ptr(const Variant *v) { return VariantInternal::get_color(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrElsewhere {}; template <> -struct VariantGetInternalPtr { - static StringName *get_ptr(Variant *v) { return VariantInternal::get_string_name(v); } - static const StringName *get_ptr(const Variant *v) { return VariantInternal::get_string_name(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrLocal {}; template <> -struct VariantGetInternalPtr { - static NodePath *get_ptr(Variant *v) { return VariantInternal::get_node_path(v); } - static const NodePath *get_ptr(const Variant *v) { return VariantInternal::get_node_path(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrLocal {}; template <> -struct VariantGetInternalPtr<::RID> { - static ::RID *get_ptr(Variant *v) { return VariantInternal::get_rid(v); } - static const ::RID *get_ptr(const Variant *v) { return VariantInternal::get_rid(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrLocal {}; template <> -struct VariantGetInternalPtr { - static Callable *get_ptr(Variant *v) { return VariantInternal::get_callable(v); } - static const Callable *get_ptr(const Variant *v) { return VariantInternal::get_callable(v); } -}; +struct VariantGetInternalPtr<::RID> : _VariantGetInternalPtrLocal<::RID> {}; + +// template <> +// struct VariantGetInternalPtr : _VariantGetInternalPtrLocal {}; template <> -struct VariantGetInternalPtr { - static Signal *get_ptr(Variant *v) { return VariantInternal::get_signal(v); } - static const Signal *get_ptr(const Variant *v) { return VariantInternal::get_signal(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrLocal {}; template <> -struct VariantGetInternalPtr { - static Dictionary *get_ptr(Variant *v) { return VariantInternal::get_dictionary(v); } - static const Dictionary *get_ptr(const Variant *v) { return VariantInternal::get_dictionary(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrLocal {}; template <> -struct VariantGetInternalPtr { - static Array *get_ptr(Variant *v) { return VariantInternal::get_array(v); } - static const Array *get_ptr(const Variant *v) { return VariantInternal::get_array(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrLocal {}; template <> -struct VariantGetInternalPtr { - static PackedByteArray *get_ptr(Variant *v) { return VariantInternal::get_byte_array(v); } - static const PackedByteArray *get_ptr(const Variant *v) { return VariantInternal::get_byte_array(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrLocal {}; template <> -struct VariantGetInternalPtr { - static PackedInt32Array *get_ptr(Variant *v) { return VariantInternal::get_int32_array(v); } - static const PackedInt32Array *get_ptr(const Variant *v) { return VariantInternal::get_int32_array(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrPackedArrayRef {}; template <> -struct VariantGetInternalPtr { - static PackedInt64Array *get_ptr(Variant *v) { return VariantInternal::get_int64_array(v); } - static const PackedInt64Array *get_ptr(const Variant *v) { return VariantInternal::get_int64_array(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrPackedArrayRef {}; template <> -struct VariantGetInternalPtr { - static PackedFloat32Array *get_ptr(Variant *v) { return VariantInternal::get_float32_array(v); } - static const PackedFloat32Array *get_ptr(const Variant *v) { return VariantInternal::get_float32_array(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrPackedArrayRef {}; template <> -struct VariantGetInternalPtr { - static PackedFloat64Array *get_ptr(Variant *v) { return VariantInternal::get_float64_array(v); } - static const PackedFloat64Array *get_ptr(const Variant *v) { return VariantInternal::get_float64_array(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrPackedArrayRef {}; template <> -struct VariantGetInternalPtr { - static PackedStringArray *get_ptr(Variant *v) { return VariantInternal::get_string_array(v); } - static const PackedStringArray *get_ptr(const Variant *v) { return VariantInternal::get_string_array(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrPackedArrayRef {}; template <> -struct VariantGetInternalPtr { - static PackedVector2Array *get_ptr(Variant *v) { return VariantInternal::get_vector2_array(v); } - static const PackedVector2Array *get_ptr(const Variant *v) { return VariantInternal::get_vector2_array(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrPackedArrayRef {}; template <> -struct VariantGetInternalPtr { - static PackedVector3Array *get_ptr(Variant *v) { return VariantInternal::get_vector3_array(v); } - static const PackedVector3Array *get_ptr(const Variant *v) { return VariantInternal::get_vector3_array(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrPackedArrayRef {}; template <> -struct VariantGetInternalPtr { - static PackedColorArray *get_ptr(Variant *v) { return VariantInternal::get_color_array(v); } - static const PackedColorArray *get_ptr(const Variant *v) { return VariantInternal::get_color_array(v); } -}; +struct VariantGetInternalPtr : _VariantGetInternalPtrPackedArrayRef {}; template <> -struct VariantGetInternalPtr { - static PackedVector4Array *get_ptr(Variant *v) { return VariantInternal::get_vector4_array(v); } - static const PackedVector4Array *get_ptr(const Variant *v) { return VariantInternal::get_vector4_array(v); } +struct VariantGetInternalPtr : _VariantGetInternalPtrPackedArrayRef {}; + +template <> +struct VariantGetInternalPtr : _VariantGetInternalPtrPackedArrayRef {}; + +template > +struct IsVariantType : std::false_type {}; + +template +struct IsVariantType::type>> : std::true_type {}; + +template +constexpr bool IsVariantTypeT = IsVariantType::value; + +/// Types that can be implicitly converted to and from Variant, +/// using another type to store the actual value. +template +struct VariantImplicitConvert; + +template +struct _VariantImplicitConvertCast { + using EncodeT = S; + static _FORCE_INLINE_ T read(const Variant &p_variant) { + return T(*VariantGetInternalPtr::get_ptr(&p_variant)); + } + static _FORCE_INLINE_ T read(Variant &p_variant) { + return T(*VariantGetInternalPtr::get_ptr(&p_variant)); + } + static _FORCE_INLINE_ void write(T p_val, Variant &p_variant) { + *VariantGetInternalPtr::get_ptr(&p_variant) = S(std::move(p_val)); + } }; +// Integer types. +template +struct VariantImplicitConvert && !std::is_same_v && !std::is_same_v>> : _VariantImplicitConvertCast {}; +template +struct VariantImplicitConvert>> : _VariantImplicitConvertCast {}; +template +struct VariantImplicitConvert, std::enable_if_t>> : _VariantImplicitConvertCast, int64_t> {}; + +template <> +struct VariantImplicitConvert : _VariantImplicitConvertCast {}; + +// Float types. +template <> +struct VariantImplicitConvert : _VariantImplicitConvertCast {}; + +template > +struct IsVariantImplicitConversionType : std::false_type {}; + +template +struct IsVariantImplicitConversionType::EncodeT>> : std::true_type {}; + +template +constexpr bool IsVariantImplicitConversionTypeT = IsVariantImplicitConversionType::value; + template struct VariantInternalAccessor; +template +struct VariantInternalAccessor>> { + static _FORCE_INLINE_ T &get(Variant *v) { return *VariantGetInternalPtr::get_ptr(v); } + static _FORCE_INLINE_ const T &get(const Variant *v) { return *VariantGetInternalPtr::get_ptr(v); } + static _FORCE_INLINE_ void set(Variant *v, T p_value) { *VariantGetInternalPtr::get_ptr(v) = std::move(p_value); } +}; + +template +struct VariantInternalAccessor>> { + static _FORCE_INLINE_ T get(const Variant *v) { return VariantImplicitConvert::read(*v); } + static _FORCE_INLINE_ void set(Variant *v, T p_value) { VariantImplicitConvert::write(std::move(p_value), *v); } +}; + template struct VariantInternalAccessor>>> : VariantInternalAccessor> {}; -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ bool get(const Variant *v) { return *VariantInternal::get_bool(v); } - static _FORCE_INLINE_ void set(Variant *v, bool p_value) { *VariantInternal::get_bool(v) = p_value; } -}; - -template -struct VariantInternalAccessor || std::is_enum_v>> { - static _FORCE_INLINE_ T get(const Variant *v) { return static_cast(*VariantInternal::get_int(v)); } - static _FORCE_INLINE_ void set(Variant *v, T p_value) { *VariantInternal::get_int(v) = static_cast(p_value); } -}; - -template -struct VariantInternalAccessor, std::enable_if_t>> { - static _FORCE_INLINE_ BitField get(const Variant *v) { return BitField(static_cast(*VariantInternal::get_int(v))); } - static _FORCE_INLINE_ void set(Variant *v, BitField p_value) { *VariantInternal::get_int(v) = static_cast(p_value); } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ ObjectID get(const Variant *v) { return ObjectID(*VariantInternal::get_int(v)); } - static _FORCE_INLINE_ void set(Variant *v, ObjectID p_value) { *VariantInternal::get_int(v) = p_value; } -}; - template struct VariantInternalAccessor { static _FORCE_INLINE_ T *get(const Variant *v) { return const_cast(static_cast(*VariantInternal::get_object(v))); } @@ -824,221 +768,6 @@ struct VariantInternalAccessor { static _FORCE_INLINE_ void set(Variant *v, IPAddress p_value) { *VariantInternal::get_string(v) = String(p_value); } }; -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ float get(const Variant *v) { return *VariantInternal::get_float(v); } - static _FORCE_INLINE_ void set(Variant *v, float p_value) { *VariantInternal::get_float(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ double get(const Variant *v) { return *VariantInternal::get_float(v); } - static _FORCE_INLINE_ void set(Variant *v, double p_value) { *VariantInternal::get_float(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const String &get(const Variant *v) { return *VariantInternal::get_string(v); } - static _FORCE_INLINE_ void set(Variant *v, const String &p_value) { *VariantInternal::get_string(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const Vector2 &get(const Variant *v) { return *VariantInternal::get_vector2(v); } - static _FORCE_INLINE_ void set(Variant *v, const Vector2 &p_value) { *VariantInternal::get_vector2(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const Vector2i &get(const Variant *v) { return *VariantInternal::get_vector2i(v); } - static _FORCE_INLINE_ void set(Variant *v, const Vector2i &p_value) { *VariantInternal::get_vector2i(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const Rect2 &get(const Variant *v) { return *VariantInternal::get_rect2(v); } - static _FORCE_INLINE_ void set(Variant *v, const Rect2 &p_value) { *VariantInternal::get_rect2(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const Rect2i &get(const Variant *v) { return *VariantInternal::get_rect2i(v); } - static _FORCE_INLINE_ void set(Variant *v, const Rect2i &p_value) { *VariantInternal::get_rect2i(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const Vector3 &get(const Variant *v) { return *VariantInternal::get_vector3(v); } - static _FORCE_INLINE_ void set(Variant *v, const Vector3 &p_value) { *VariantInternal::get_vector3(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const Vector3i &get(const Variant *v) { return *VariantInternal::get_vector3i(v); } - static _FORCE_INLINE_ void set(Variant *v, const Vector3i &p_value) { *VariantInternal::get_vector3i(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const Vector4 &get(const Variant *v) { return *VariantInternal::get_vector4(v); } - static _FORCE_INLINE_ void set(Variant *v, const Vector4 &p_value) { *VariantInternal::get_vector4(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const Vector4i &get(const Variant *v) { return *VariantInternal::get_vector4i(v); } - static _FORCE_INLINE_ void set(Variant *v, const Vector4i &p_value) { *VariantInternal::get_vector4i(v) = p_value; } -}; -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const Transform2D &get(const Variant *v) { return *VariantInternal::get_transform2d(v); } - static _FORCE_INLINE_ void set(Variant *v, const Transform2D &p_value) { *VariantInternal::get_transform2d(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const Transform3D &get(const Variant *v) { return *VariantInternal::get_transform(v); } - static _FORCE_INLINE_ void set(Variant *v, const Transform3D &p_value) { *VariantInternal::get_transform(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const Projection &get(const Variant *v) { return *VariantInternal::get_projection(v); } - static _FORCE_INLINE_ void set(Variant *v, const Projection &p_value) { *VariantInternal::get_projection(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const Plane &get(const Variant *v) { return *VariantInternal::get_plane(v); } - static _FORCE_INLINE_ void set(Variant *v, const Plane &p_value) { *VariantInternal::get_plane(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const Quaternion &get(const Variant *v) { return *VariantInternal::get_quaternion(v); } - static _FORCE_INLINE_ void set(Variant *v, const Quaternion &p_value) { *VariantInternal::get_quaternion(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const AABB &get(const Variant *v) { return *VariantInternal::get_aabb(v); } - static _FORCE_INLINE_ void set(Variant *v, const AABB &p_value) { *VariantInternal::get_aabb(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const Basis &get(const Variant *v) { return *VariantInternal::get_basis(v); } - static _FORCE_INLINE_ void set(Variant *v, const Basis &p_value) { *VariantInternal::get_basis(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const Color &get(const Variant *v) { return *VariantInternal::get_color(v); } - static _FORCE_INLINE_ void set(Variant *v, const Color &p_value) { *VariantInternal::get_color(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const StringName &get(const Variant *v) { return *VariantInternal::get_string_name(v); } - static _FORCE_INLINE_ void set(Variant *v, const StringName &p_value) { *VariantInternal::get_string_name(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const NodePath &get(const Variant *v) { return *VariantInternal::get_node_path(v); } - static _FORCE_INLINE_ void set(Variant *v, const NodePath &p_value) { *VariantInternal::get_node_path(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor<::RID> { - static _FORCE_INLINE_ const ::RID &get(const Variant *v) { return *VariantInternal::get_rid(v); } - static _FORCE_INLINE_ void set(Variant *v, const ::RID &p_value) { *VariantInternal::get_rid(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const Callable &get(const Variant *v) { return *VariantInternal::get_callable(v); } - static _FORCE_INLINE_ void set(Variant *v, const Callable &p_value) { *VariantInternal::get_callable(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const Signal &get(const Variant *v) { return *VariantInternal::get_signal(v); } - static _FORCE_INLINE_ void set(Variant *v, const Signal &p_value) { *VariantInternal::get_signal(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const Dictionary &get(const Variant *v) { return *VariantInternal::get_dictionary(v); } - static _FORCE_INLINE_ void set(Variant *v, const Dictionary &p_value) { *VariantInternal::get_dictionary(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const Array &get(const Variant *v) { return *VariantInternal::get_array(v); } - static _FORCE_INLINE_ void set(Variant *v, const Array &p_value) { *VariantInternal::get_array(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const PackedByteArray &get(const Variant *v) { return *VariantInternal::get_byte_array(v); } - static _FORCE_INLINE_ void set(Variant *v, const PackedByteArray &p_value) { *VariantInternal::get_byte_array(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const PackedInt32Array &get(const Variant *v) { return *VariantInternal::get_int32_array(v); } - static _FORCE_INLINE_ void set(Variant *v, const PackedInt32Array &p_value) { *VariantInternal::get_int32_array(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const PackedInt64Array &get(const Variant *v) { return *VariantInternal::get_int64_array(v); } - static _FORCE_INLINE_ void set(Variant *v, const PackedInt64Array &p_value) { *VariantInternal::get_int64_array(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const PackedFloat32Array &get(const Variant *v) { return *VariantInternal::get_float32_array(v); } - static _FORCE_INLINE_ void set(Variant *v, const PackedFloat32Array &p_value) { *VariantInternal::get_float32_array(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const PackedFloat64Array &get(const Variant *v) { return *VariantInternal::get_float64_array(v); } - static _FORCE_INLINE_ void set(Variant *v, const PackedFloat64Array &p_value) { *VariantInternal::get_float64_array(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const PackedStringArray &get(const Variant *v) { return *VariantInternal::get_string_array(v); } - static _FORCE_INLINE_ void set(Variant *v, const PackedStringArray &p_value) { *VariantInternal::get_string_array(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const PackedVector2Array &get(const Variant *v) { return *VariantInternal::get_vector2_array(v); } - static _FORCE_INLINE_ void set(Variant *v, const PackedVector2Array &p_value) { *VariantInternal::get_vector2_array(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const PackedVector3Array &get(const Variant *v) { return *VariantInternal::get_vector3_array(v); } - static _FORCE_INLINE_ void set(Variant *v, const PackedVector3Array &p_value) { *VariantInternal::get_vector3_array(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const PackedColorArray &get(const Variant *v) { return *VariantInternal::get_color_array(v); } - static _FORCE_INLINE_ void set(Variant *v, const PackedColorArray &p_value) { *VariantInternal::get_color_array(v) = p_value; } -}; - -template <> -struct VariantInternalAccessor { - static _FORCE_INLINE_ const PackedVector4Array &get(const Variant *v) { return *VariantInternal::get_vector4_array(v); } - static _FORCE_INLINE_ void set(Variant *v, const PackedVector4Array &p_value) { *VariantInternal::get_vector4_array(v) = p_value; } -}; - template <> struct VariantInternalAccessor { static _FORCE_INLINE_ Object *get(const Variant *v) { return const_cast(*VariantInternal::get_object(v)); } @@ -1073,14 +802,17 @@ struct VariantInternalAccessor> { } }; -template +template struct VariantInitializer { static _FORCE_INLINE_ void init(Variant *v) { VariantInternal::init_generic(v); } }; -template <> -struct VariantInitializer { - static _FORCE_INLINE_ void init(Variant *v) { VariantInternal::init_string(v); } +template +struct VariantInitializer::is_local>> { + static _FORCE_INLINE_ void init(Variant *v) { + memnew_placement(VariantGetInternalPtr::get_ptr(v), T); + VariantInternal::set_type(*v, GetTypeInfo::VARIANT_TYPE); + } }; template <> @@ -1108,36 +840,6 @@ struct VariantInitializer { static _FORCE_INLINE_ void init(Variant *v) { VariantInternal::init_projection(v); } }; -template <> -struct VariantInitializer { - static _FORCE_INLINE_ void init(Variant *v) { VariantInternal::init_string_name(v); } -}; - -template <> -struct VariantInitializer { - static _FORCE_INLINE_ void init(Variant *v) { VariantInternal::init_node_path(v); } -}; - -template <> -struct VariantInitializer { - static _FORCE_INLINE_ void init(Variant *v) { VariantInternal::init_callable(v); } -}; - -template <> -struct VariantInitializer { - static _FORCE_INLINE_ void init(Variant *v) { VariantInternal::init_signal(v); } -}; - -template <> -struct VariantInitializer { - static _FORCE_INLINE_ void init(Variant *v) { VariantInternal::init_dictionary(v); } -}; - -template <> -struct VariantInitializer { - static _FORCE_INLINE_ void init(Variant *v) { VariantInternal::init_array(v); } -}; - template <> struct VariantInitializer { static _FORCE_INLINE_ void init(Variant *v) { VariantInternal::init_byte_array(v); } @@ -1193,205 +895,15 @@ struct VariantInitializer { static _FORCE_INLINE_ void init(Variant *v) { VariantInternal::init_object(v); } }; +/// Note: This struct assumes that the argument type is already of the correct type. template struct VariantDefaultInitializer; template -struct VariantDefaultInitializer>>> : VariantDefaultInitializer> {}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_bool(v) = false; } -}; - -template -struct VariantDefaultInitializer || std::is_enum_v>> { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_int(v) = 0; } -}; - -template -struct VariantDefaultInitializer, std::enable_if_t>> { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_int(v) = 0; } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_float(v) = 0.0; } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_float(v) = 0.0; } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_string(v) = String(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_vector2(v) = Vector2(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_vector2i(v) = Vector2i(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_rect2(v) = Rect2(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_rect2i(v) = Rect2i(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_vector3(v) = Vector3(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_vector3i(v) = Vector3i(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_vector4(v) = Vector4(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_vector4i(v) = Vector4i(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_transform2d(v) = Transform2D(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_plane(v) = Plane(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_quaternion(v) = Quaternion(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_aabb(v) = AABB(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_basis(v) = Basis(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_transform(v) = Transform3D(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_projection(v) = Projection(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_color(v) = Color(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_string_name(v) = StringName(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_node_path(v) = NodePath(); } -}; - -template <> -struct VariantDefaultInitializer<::RID> { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_rid(v) = RID(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_callable(v) = Callable(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_signal(v) = Signal(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_dictionary(v) = Dictionary(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_array(v) = Array(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_byte_array(v) = PackedByteArray(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_int32_array(v) = PackedInt32Array(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_int64_array(v) = PackedInt64Array(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_float32_array(v) = PackedFloat32Array(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_float64_array(v) = PackedFloat64Array(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_string_array(v) = PackedStringArray(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_vector2_array(v) = PackedVector2Array(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_vector3_array(v) = PackedVector3Array(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_color_array(v) = PackedColorArray(); } -}; - -template <> -struct VariantDefaultInitializer { - static _FORCE_INLINE_ void init(Variant *v) { *VariantInternal::get_vector4_array(v) = PackedVector4Array(); } +struct VariantDefaultInitializer>> { + static _FORCE_INLINE_ void init(Variant *v) { + *VariantGetInternalPtr::get_ptr(v) = T(); + } }; template diff --git a/servers/rendering/shader_language.cpp b/servers/rendering/shader_language.cpp index 7e876456783..8ddb3ec20b0 100644 --- a/servers/rendering/shader_language.cpp +++ b/servers/rendering/shader_language.cpp @@ -4726,8 +4726,8 @@ Variant ShaderLanguage::get_default_datatype_value(DataType p_type, int p_array_ } value = Variant(array); } else { - VariantInitializer::init(&value); - VariantDefaultInitializer::init(&value); + VariantInitializer::init(&value); + VariantDefaultInitializer::init(&value); } break; case ShaderLanguage::TYPE_VEC2: