diff options
Diffstat (limited to 'core/variant/variant_internal.h')
-rw-r--r-- | core/variant/variant_internal.h | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/core/variant/variant_internal.h b/core/variant/variant_internal.h index 0d55ee4ae2..b7bd2a9c8c 100644 --- a/core/variant/variant_internal.h +++ b/core/variant/variant_internal.h @@ -35,6 +35,9 @@ // For use when you want to access the internal pointer of a Variant directly. // Use with caution. You need to be sure that the type is correct. + +class RefCounted; + class VariantInternal { friend class Variant; @@ -320,6 +323,7 @@ public: } static void object_assign(Variant *v, const Object *o); // Needs RefCounted, so it's implemented elsewhere. + static void refcounted_object_assign(Variant *v, const RefCounted *rc); _FORCE_INLINE_ static void object_assign(Variant *v, const Variant *o) { object_assign(v, o->_get_obj().obj); @@ -820,28 +824,28 @@ VARIANT_ACCESSOR_NUMBER(int64_t) VARIANT_ACCESSOR_NUMBER(uint64_t) VARIANT_ACCESSOR_NUMBER(char32_t) -// Bind enums to allow using them as return types. -VARIANT_ACCESSOR_NUMBER(Error) -VARIANT_ACCESSOR_NUMBER(Side) -VARIANT_ACCESSOR_NUMBER(Vector2::Axis) -VARIANT_ACCESSOR_NUMBER(Vector2i::Axis) -VARIANT_ACCESSOR_NUMBER(Vector3::Axis) -VARIANT_ACCESSOR_NUMBER(Vector3i::Axis) -VARIANT_ACCESSOR_NUMBER(Vector4::Axis) -VARIANT_ACCESSOR_NUMBER(Vector4i::Axis) +template <> +struct VariantInternalAccessor<ObjectID> { + 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; } +}; -VARIANT_ACCESSOR_NUMBER(Projection::Planes) +template <class T> +struct VariantInternalAccessor<T *> { + static _FORCE_INLINE_ T *get(const Variant *v) { return const_cast<T *>(static_cast<const T *>(*VariantInternal::get_object(v))); } + static _FORCE_INLINE_ void set(Variant *v, const T *p_value) { VariantInternal::object_assign(v, p_value); } +}; -template <> -struct VariantInternalAccessor<EulerOrder> { - static _FORCE_INLINE_ EulerOrder get(const Variant *v) { return EulerOrder(*VariantInternal::get_int(v)); } - static _FORCE_INLINE_ void set(Variant *v, EulerOrder p_value) { *VariantInternal::get_int(v) = (int64_t)p_value; } +template <class T> +struct VariantInternalAccessor<const T *> { + static _FORCE_INLINE_ const T *get(const Variant *v) { return static_cast<const T *>(*VariantInternal::get_object(v)); } + static _FORCE_INLINE_ void set(Variant *v, const T *p_value) { VariantInternal::object_assign(v, p_value); } }; template <> -struct VariantInternalAccessor<ObjectID> { - 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; } +struct VariantInternalAccessor<IPAddress> { + static _FORCE_INLINE_ IPAddress get(const Variant *v) { return IPAddress(*VariantInternal::get_string(v)); } + static _FORCE_INLINE_ void set(Variant *v, IPAddress p_value) { *VariantInternal::get_string(v) = p_value; } }; template <> |