Split VariantCaster from binder_common.h
This commit is contained in:
parent
1d5e34ed7b
commit
282e4544b0
39 changed files with 255 additions and 207 deletions
|
|
@ -32,7 +32,7 @@
|
|||
|
||||
#include "core/crypto/crypto_core.h"
|
||||
#include "core/object/ref_counted.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
#include "core/variant/type_info.h"
|
||||
|
||||
class AESContext : public RefCounted {
|
||||
GDCLASS(AESContext, RefCounted);
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
#pragma once
|
||||
|
||||
#include "core/object/ref_counted.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
#include "core/variant/type_info.h"
|
||||
|
||||
class HashingContext : public RefCounted {
|
||||
GDCLASS(HashingContext, RefCounted);
|
||||
|
|
|
|||
|
|
@ -34,6 +34,8 @@
|
|||
#include "core/os/main_loop.h"
|
||||
#include "core/os/os.h"
|
||||
|
||||
#include <cstdio>
|
||||
|
||||
struct LocalDebugger::ScriptsProfiler {
|
||||
struct ProfileInfoSort {
|
||||
bool operator()(const ScriptLanguage::ProfilingInfo &A, const ScriptLanguage::ProfilingInfo &B) const {
|
||||
|
|
|
|||
|
|
@ -36,6 +36,8 @@
|
|||
#include "core/os/os.h"
|
||||
#include "core/string/ustring.h"
|
||||
|
||||
#include <cstdio>
|
||||
|
||||
// Optional physics interpolation warnings try to include the path to the relevant node.
|
||||
#if defined(DEBUG_ENABLED) && defined(TOOLS_ENABLED)
|
||||
#include "core/config/project_settings.h"
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
#include "core/os/memory.h"
|
||||
#include "core/string/ustring.h"
|
||||
#include "core/typedefs.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
#include "core/variant/type_info.h"
|
||||
|
||||
/**
|
||||
* Multi-Platform abstraction for accessing to files.
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
#include "core/object/gdvirtual.gen.h"
|
||||
#include "core/string/ustring.h"
|
||||
#include "core/templates/list.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
#include "core/variant/type_info.h"
|
||||
|
||||
class ImageLoader;
|
||||
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
#pragma once
|
||||
|
||||
#include "core/io/ip_address.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
#include "core/variant/type_info.h"
|
||||
|
||||
template <typename T>
|
||||
class TypedArray;
|
||||
|
|
|
|||
|
|
@ -39,6 +39,8 @@
|
|||
|
||||
#include "modules/modules_enabled.gen.h" // For regex.
|
||||
|
||||
#include <cstdio>
|
||||
|
||||
#ifdef MODULE_REGEX_ENABLED
|
||||
#include "modules/regex/regex.h"
|
||||
#endif // MODULE_REGEX_ENABLED
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
#include "core/object/ref_counted.h"
|
||||
#include "core/string/ustring.h"
|
||||
#include "core/templates/vector.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
#include "core/variant/type_info.h"
|
||||
|
||||
/*
|
||||
Based on irrXML (see their zlib license). Added mainly for compatibility with their Collada loader.
|
||||
|
|
|
|||
|
|
@ -197,7 +197,9 @@ def run(target, source, env):
|
|||
#pragma once
|
||||
|
||||
#include "core/object/script_instance.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
#include "core/variant/method_ptrcall.h"
|
||||
#include "core/variant/variant_caster.h"
|
||||
#include "core/variant/variant_internal.h"
|
||||
|
||||
inline constexpr uintptr_t _INVALID_GDVIRTUAL_FUNC_ADDR = static_cast<uintptr_t>(-1);
|
||||
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
#pragma once
|
||||
|
||||
#include "core/object/ref_counted.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
#include "core/variant/type_info.h"
|
||||
|
||||
class UndoRedo : public Object {
|
||||
GDCLASS(UndoRedo, Object);
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
#pragma once
|
||||
|
||||
#include "core/object/object.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
#include "core/variant/type_info.h"
|
||||
#include "time_enums.h"
|
||||
|
||||
// This Time class conforms with as many of the ISO 8601 standards as possible.
|
||||
|
|
|
|||
|
|
@ -50,6 +50,8 @@ STATIC_ASSERT_INCOMPLETE_TYPE(class, Object);
|
|||
|
||||
#include "thirdparty/grisu2/grisu2.h"
|
||||
|
||||
#include <cstdio>
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define _CRT_SECURE_NO_WARNINGS // to disable build-time warning which suggested to use strcpy_s instead strcpy
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -36,115 +36,11 @@
|
|||
#include "core/variant/method_ptrcall.h"
|
||||
#include "core/variant/type_info.h"
|
||||
#include "core/variant/variant.h"
|
||||
#include "core/variant/variant_caster.h"
|
||||
#include "core/variant/variant_internal.h"
|
||||
|
||||
#include <cstdio>
|
||||
|
||||
enum class HatDir;
|
||||
enum class HatMask;
|
||||
enum class JoyAxis;
|
||||
enum class JoyButton;
|
||||
|
||||
enum class MIDIMessage;
|
||||
enum class MouseButton;
|
||||
enum class MouseButtonMask;
|
||||
|
||||
enum class Key;
|
||||
enum class KeyModifierMask;
|
||||
enum class KeyLocation;
|
||||
|
||||
// Variant cannot define an implicit cast operator for every Object subclass, so the
|
||||
// casting is done here, to allow binding methods with parameters more specific than Object *
|
||||
|
||||
template <typename T>
|
||||
struct VariantCaster {
|
||||
static _FORCE_INLINE_ T cast(const Variant &p_variant) {
|
||||
using TStripped = std::remove_pointer_t<T>;
|
||||
if constexpr (std::is_base_of_v<Object, TStripped>) {
|
||||
return Object::cast_to<TStripped>(p_variant);
|
||||
} else {
|
||||
return p_variant;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct VariantCaster<T &> {
|
||||
static _FORCE_INLINE_ T cast(const Variant &p_variant) {
|
||||
using TStripped = std::remove_pointer_t<T>;
|
||||
if constexpr (std::is_base_of_v<Object, TStripped>) {
|
||||
return Object::cast_to<TStripped>(p_variant);
|
||||
} else {
|
||||
return p_variant;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct VariantCaster<const T &> {
|
||||
static _FORCE_INLINE_ T cast(const Variant &p_variant) {
|
||||
using TStripped = std::remove_pointer_t<T>;
|
||||
if constexpr (std::is_base_of_v<Object, TStripped>) {
|
||||
return Object::cast_to<TStripped>(p_variant);
|
||||
} else {
|
||||
return p_variant;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
#define VARIANT_ENUM_CAST(m_enum) MAKE_ENUM_TYPE_INFO(m_enum, m_enum)
|
||||
#define VARIANT_BITFIELD_CAST(m_enum) MAKE_BITFIELD_TYPE_INFO(m_enum, m_enum)
|
||||
|
||||
// Use only for backwards compatibility when the location of an enum changes.
|
||||
#define VARIANT_ENUM_CAST_EXT(m_enum, m_bound_name) MAKE_ENUM_TYPE_INFO(m_enum, m_bound_name)
|
||||
#define VARIANT_BITFIELD_CAST_EXT(m_enum, m_bound_name) MAKE_BITFIELD_TYPE_INFO(m_enum, m_bound_name)
|
||||
|
||||
// Object enum casts must go here
|
||||
VARIANT_ENUM_CAST(Object::ConnectFlags);
|
||||
|
||||
VARIANT_ENUM_CAST(Vector2::Axis);
|
||||
VARIANT_ENUM_CAST(Vector2i::Axis);
|
||||
VARIANT_ENUM_CAST(Vector3::Axis);
|
||||
VARIANT_ENUM_CAST(Vector3i::Axis);
|
||||
VARIANT_ENUM_CAST(Vector4::Axis);
|
||||
VARIANT_ENUM_CAST(Vector4i::Axis);
|
||||
VARIANT_ENUM_CAST(EulerOrder);
|
||||
VARIANT_ENUM_CAST(Projection::Planes);
|
||||
|
||||
VARIANT_ENUM_CAST(Error);
|
||||
VARIANT_ENUM_CAST(Side);
|
||||
VARIANT_ENUM_CAST(ClockDirection);
|
||||
VARIANT_ENUM_CAST(Corner);
|
||||
VARIANT_ENUM_CAST(HatDir);
|
||||
VARIANT_BITFIELD_CAST(HatMask);
|
||||
VARIANT_ENUM_CAST(JoyAxis);
|
||||
VARIANT_ENUM_CAST(JoyButton);
|
||||
|
||||
VARIANT_ENUM_CAST(MIDIMessage);
|
||||
VARIANT_ENUM_CAST(MouseButton);
|
||||
VARIANT_BITFIELD_CAST(MouseButtonMask);
|
||||
VARIANT_ENUM_CAST(Orientation);
|
||||
VARIANT_ENUM_CAST(HorizontalAlignment);
|
||||
VARIANT_ENUM_CAST(VerticalAlignment);
|
||||
VARIANT_ENUM_CAST(InlineAlignment);
|
||||
VARIANT_ENUM_CAST(PropertyHint);
|
||||
VARIANT_BITFIELD_CAST(PropertyUsageFlags);
|
||||
VARIANT_ENUM_CAST(Variant::Type);
|
||||
VARIANT_ENUM_CAST(Variant::Operator);
|
||||
|
||||
// Key
|
||||
|
||||
VARIANT_ENUM_CAST(Key);
|
||||
VARIANT_BITFIELD_CAST(KeyModifierMask);
|
||||
VARIANT_ENUM_CAST(KeyLocation);
|
||||
|
||||
template <>
|
||||
struct VariantCaster<char32_t> {
|
||||
static _FORCE_INLINE_ char32_t cast(const Variant &p_variant) {
|
||||
return (char32_t)p_variant.operator int();
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
struct PtrToArg<char32_t> {
|
||||
_FORCE_INLINE_ static char32_t convert(const void *p_ptr) {
|
||||
|
|
@ -156,80 +52,6 @@ struct PtrToArg<char32_t> {
|
|||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct VariantObjectClassChecker {
|
||||
static _FORCE_INLINE_ bool check(const Variant &p_variant) {
|
||||
using TStripped = std::remove_pointer_t<T>;
|
||||
if constexpr (std::is_base_of_v<Object, TStripped>) {
|
||||
Object *obj = p_variant;
|
||||
return Object::cast_to<TStripped>(p_variant) || !obj;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class Ref;
|
||||
|
||||
template <typename T>
|
||||
struct VariantObjectClassChecker<const Ref<T> &> {
|
||||
static _FORCE_INLINE_ bool check(const Variant &p_variant) {
|
||||
Object *obj = p_variant;
|
||||
const Ref<T> node = p_variant;
|
||||
return node.ptr() || !obj;
|
||||
}
|
||||
};
|
||||
|
||||
#ifdef DEBUG_ENABLED
|
||||
|
||||
template <typename T>
|
||||
struct VariantCasterAndValidate {
|
||||
static _FORCE_INLINE_ T cast(const Variant **p_args, uint32_t p_arg_idx, Callable::CallError &r_error) {
|
||||
Variant::Type argtype = GetTypeInfo<T>::VARIANT_TYPE;
|
||||
if (!Variant::can_convert_strict(p_args[p_arg_idx]->get_type(), argtype) ||
|
||||
!VariantObjectClassChecker<T>::check(*p_args[p_arg_idx])) {
|
||||
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
||||
r_error.argument = p_arg_idx;
|
||||
r_error.expected = argtype;
|
||||
}
|
||||
|
||||
return VariantCaster<T>::cast(*p_args[p_arg_idx]);
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct VariantCasterAndValidate<T &> {
|
||||
static _FORCE_INLINE_ T cast(const Variant **p_args, uint32_t p_arg_idx, Callable::CallError &r_error) {
|
||||
Variant::Type argtype = GetTypeInfo<T>::VARIANT_TYPE;
|
||||
if (!Variant::can_convert_strict(p_args[p_arg_idx]->get_type(), argtype) ||
|
||||
!VariantObjectClassChecker<T>::check(*p_args[p_arg_idx])) {
|
||||
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
||||
r_error.argument = p_arg_idx;
|
||||
r_error.expected = argtype;
|
||||
}
|
||||
|
||||
return VariantCaster<T>::cast(*p_args[p_arg_idx]);
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct VariantCasterAndValidate<const T &> {
|
||||
static _FORCE_INLINE_ T cast(const Variant **p_args, uint32_t p_arg_idx, Callable::CallError &r_error) {
|
||||
Variant::Type argtype = GetTypeInfo<T>::VARIANT_TYPE;
|
||||
if (!Variant::can_convert_strict(p_args[p_arg_idx]->get_type(), argtype) ||
|
||||
!VariantObjectClassChecker<T>::check(*p_args[p_arg_idx])) {
|
||||
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
||||
r_error.argument = p_arg_idx;
|
||||
r_error.expected = argtype;
|
||||
}
|
||||
|
||||
return VariantCaster<T>::cast(*p_args[p_arg_idx]);
|
||||
}
|
||||
};
|
||||
|
||||
#endif // DEBUG_ENABLED
|
||||
|
||||
template <typename T, typename... P, size_t... Is>
|
||||
void call_with_variant_args_helper(T *p_instance, void (T::*p_method)(P...), const Variant **p_args, Callable::CallError &r_error, IndexSequence<Is...>) {
|
||||
r_error.error = Callable::CallError::CALL_OK;
|
||||
|
|
|
|||
|
|
@ -31,9 +31,10 @@
|
|||
#pragma once
|
||||
|
||||
#include "core/math/audio_frame.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
#include "core/variant/method_ptrcall.h"
|
||||
#include "core/variant/type_info.h"
|
||||
#include "core/variant/variant_caster.h"
|
||||
#include "core/variant/variant_internal.h"
|
||||
|
||||
template <typename T>
|
||||
struct GDExtensionConstPtr {
|
||||
|
|
|
|||
|
|
@ -290,6 +290,13 @@ inline StringName __constant_get_bitfield_name(T param) {
|
|||
}
|
||||
#define CLASS_INFO(m_type) (GetTypeInfo<m_type *>::get_class_info())
|
||||
|
||||
#define VARIANT_ENUM_CAST(m_enum) MAKE_ENUM_TYPE_INFO(m_enum, m_enum)
|
||||
#define VARIANT_BITFIELD_CAST(m_enum) MAKE_BITFIELD_TYPE_INFO(m_enum, m_enum)
|
||||
|
||||
// Use only for backwards compatibility when the location of an enum changes.
|
||||
#define VARIANT_ENUM_CAST_EXT(m_enum, m_bound_name) MAKE_ENUM_TYPE_INFO(m_enum, m_bound_name)
|
||||
#define VARIANT_BITFIELD_CAST_EXT(m_enum, m_bound_name) MAKE_BITFIELD_TYPE_INFO(m_enum, m_bound_name)
|
||||
|
||||
// No initialization by default, except for scalar types.
|
||||
template <typename T>
|
||||
struct ZeroInitializer {
|
||||
|
|
|
|||
206
core/variant/variant_caster.h
Normal file
206
core/variant/variant_caster.h
Normal file
|
|
@ -0,0 +1,206 @@
|
|||
/**************************************************************************/
|
||||
/* variant_caster.h */
|
||||
/**************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/**************************************************************************/
|
||||
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
|
||||
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/**************************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "core/object/object.h"
|
||||
#include "core/variant/type_info.h"
|
||||
|
||||
enum class HatDir;
|
||||
enum class HatMask;
|
||||
enum class JoyAxis;
|
||||
enum class JoyButton;
|
||||
|
||||
enum class MIDIMessage;
|
||||
enum class MouseButton;
|
||||
enum class MouseButtonMask;
|
||||
|
||||
enum class Key;
|
||||
enum class KeyModifierMask;
|
||||
enum class KeyLocation;
|
||||
|
||||
// Variant cannot define an implicit cast operator for every Object subclass, so the
|
||||
// casting is done here, to allow binding methods with parameters more specific than Object *
|
||||
|
||||
template <typename T>
|
||||
struct VariantCaster {
|
||||
static _FORCE_INLINE_ T cast(const Variant &p_variant) {
|
||||
using TStripped = std::remove_pointer_t<T>;
|
||||
if constexpr (std::is_base_of_v<Object, TStripped>) {
|
||||
return Object::cast_to<TStripped>(p_variant);
|
||||
} else {
|
||||
return p_variant;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct VariantCaster<T &> {
|
||||
static _FORCE_INLINE_ T cast(const Variant &p_variant) {
|
||||
using TStripped = std::remove_pointer_t<T>;
|
||||
if constexpr (std::is_base_of_v<Object, TStripped>) {
|
||||
return Object::cast_to<TStripped>(p_variant);
|
||||
} else {
|
||||
return p_variant;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct VariantCaster<const T &> {
|
||||
static _FORCE_INLINE_ T cast(const Variant &p_variant) {
|
||||
using TStripped = std::remove_pointer_t<T>;
|
||||
if constexpr (std::is_base_of_v<Object, TStripped>) {
|
||||
return Object::cast_to<TStripped>(p_variant);
|
||||
} else {
|
||||
return p_variant;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Object enum casts must go here
|
||||
VARIANT_ENUM_CAST(Object::ConnectFlags);
|
||||
|
||||
VARIANT_ENUM_CAST(Vector2::Axis);
|
||||
VARIANT_ENUM_CAST(Vector2i::Axis);
|
||||
VARIANT_ENUM_CAST(Vector3::Axis);
|
||||
VARIANT_ENUM_CAST(Vector3i::Axis);
|
||||
VARIANT_ENUM_CAST(Vector4::Axis);
|
||||
VARIANT_ENUM_CAST(Vector4i::Axis);
|
||||
VARIANT_ENUM_CAST(EulerOrder);
|
||||
VARIANT_ENUM_CAST(Projection::Planes);
|
||||
|
||||
VARIANT_ENUM_CAST(Error);
|
||||
VARIANT_ENUM_CAST(Side);
|
||||
VARIANT_ENUM_CAST(ClockDirection);
|
||||
VARIANT_ENUM_CAST(Corner);
|
||||
VARIANT_ENUM_CAST(HatDir);
|
||||
VARIANT_BITFIELD_CAST(HatMask);
|
||||
VARIANT_ENUM_CAST(JoyAxis);
|
||||
VARIANT_ENUM_CAST(JoyButton);
|
||||
|
||||
VARIANT_ENUM_CAST(MIDIMessage);
|
||||
VARIANT_ENUM_CAST(MouseButton);
|
||||
VARIANT_BITFIELD_CAST(MouseButtonMask);
|
||||
VARIANT_ENUM_CAST(Orientation);
|
||||
VARIANT_ENUM_CAST(HorizontalAlignment);
|
||||
VARIANT_ENUM_CAST(VerticalAlignment);
|
||||
VARIANT_ENUM_CAST(InlineAlignment);
|
||||
VARIANT_ENUM_CAST(PropertyHint);
|
||||
VARIANT_BITFIELD_CAST(PropertyUsageFlags);
|
||||
VARIANT_ENUM_CAST(Variant::Type);
|
||||
VARIANT_ENUM_CAST(Variant::Operator);
|
||||
|
||||
// Key
|
||||
|
||||
VARIANT_ENUM_CAST(Key);
|
||||
VARIANT_BITFIELD_CAST(KeyModifierMask);
|
||||
VARIANT_ENUM_CAST(KeyLocation);
|
||||
|
||||
template <>
|
||||
struct VariantCaster<char32_t> {
|
||||
static _FORCE_INLINE_ char32_t cast(const Variant &p_variant) {
|
||||
return (char32_t)p_variant.operator int();
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct VariantObjectClassChecker {
|
||||
static _FORCE_INLINE_ bool check(const Variant &p_variant) {
|
||||
using TStripped = std::remove_pointer_t<T>;
|
||||
if constexpr (std::is_base_of_v<Object, TStripped>) {
|
||||
Object *obj = p_variant;
|
||||
return Object::cast_to<TStripped>(p_variant) || !obj;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class Ref;
|
||||
|
||||
template <typename T>
|
||||
struct VariantObjectClassChecker<const Ref<T> &> {
|
||||
static _FORCE_INLINE_ bool check(const Variant &p_variant) {
|
||||
Object *obj = p_variant;
|
||||
const Ref<T> node = p_variant;
|
||||
return node.ptr() || !obj;
|
||||
}
|
||||
};
|
||||
|
||||
#ifdef DEBUG_ENABLED
|
||||
|
||||
template <typename T>
|
||||
struct VariantCasterAndValidate {
|
||||
static _FORCE_INLINE_ T cast(const Variant **p_args, uint32_t p_arg_idx, Callable::CallError &r_error) {
|
||||
Variant::Type argtype = GetTypeInfo<T>::VARIANT_TYPE;
|
||||
if (!Variant::can_convert_strict(p_args[p_arg_idx]->get_type(), argtype) ||
|
||||
!VariantObjectClassChecker<T>::check(*p_args[p_arg_idx])) {
|
||||
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
||||
r_error.argument = p_arg_idx;
|
||||
r_error.expected = argtype;
|
||||
}
|
||||
|
||||
return VariantCaster<T>::cast(*p_args[p_arg_idx]);
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct VariantCasterAndValidate<T &> {
|
||||
static _FORCE_INLINE_ T cast(const Variant **p_args, uint32_t p_arg_idx, Callable::CallError &r_error) {
|
||||
Variant::Type argtype = GetTypeInfo<T>::VARIANT_TYPE;
|
||||
if (!Variant::can_convert_strict(p_args[p_arg_idx]->get_type(), argtype) ||
|
||||
!VariantObjectClassChecker<T>::check(*p_args[p_arg_idx])) {
|
||||
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
||||
r_error.argument = p_arg_idx;
|
||||
r_error.expected = argtype;
|
||||
}
|
||||
|
||||
return VariantCaster<T>::cast(*p_args[p_arg_idx]);
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct VariantCasterAndValidate<const T &> {
|
||||
static _FORCE_INLINE_ T cast(const Variant **p_args, uint32_t p_arg_idx, Callable::CallError &r_error) {
|
||||
Variant::Type argtype = GetTypeInfo<T>::VARIANT_TYPE;
|
||||
if (!Variant::can_convert_strict(p_args[p_arg_idx]->get_type(), argtype) ||
|
||||
!VariantObjectClassChecker<T>::check(*p_args[p_arg_idx])) {
|
||||
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
||||
r_error.argument = p_arg_idx;
|
||||
r_error.expected = argtype;
|
||||
}
|
||||
|
||||
return VariantCaster<T>::cast(*p_args[p_arg_idx]);
|
||||
}
|
||||
};
|
||||
|
||||
#endif // DEBUG_ENABLED
|
||||
|
|
@ -37,6 +37,7 @@
|
|||
#include "core/io/compression.h"
|
||||
#include "core/templates/a_hash_map.h"
|
||||
#include "core/templates/local_vector.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
#include "core/variant/native_ptr.h"
|
||||
#include "core/variant/variant_internal.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
class EditorExportPlatform;
|
||||
|
||||
#include "core/object/ref_counted.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
#include "core/variant/type_info.h"
|
||||
|
||||
class EditorExportPreset : public RefCounted {
|
||||
GDCLASS(EditorExportPreset, RefCounted);
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@
|
|||
|
||||
#include "core/object/object.h"
|
||||
#include "core/templates/hash_map.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
#include "core/variant/type_info.h"
|
||||
|
||||
#define PERF_WARN_OFFLINE_FUNCTION
|
||||
#define PERF_WARN_PROCESS_SYNC
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
#pragma once
|
||||
|
||||
#include "core/object/object.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
#include "core/variant/type_info.h"
|
||||
#include "core/variant/variant.h"
|
||||
|
||||
class JSONRPC : public Object {
|
||||
|
|
|
|||
|
|
@ -32,7 +32,6 @@
|
|||
|
||||
#include "2d/nav_base_iteration_2d.h"
|
||||
#include "core/os/rw_lock.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
#include "nav_base_2d.h"
|
||||
#include "nav_utils_2d.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -33,7 +33,6 @@
|
|||
#include "upnp_device.h"
|
||||
|
||||
#include "core/object/ref_counted.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
|
||||
class UPNP : public RefCounted {
|
||||
GDCLASS(UPNP, RefCounted);
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
#pragma once
|
||||
|
||||
#include "core/object/ref_counted.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
#include "core/variant/type_info.h"
|
||||
|
||||
class UPNPDevice : public RefCounted {
|
||||
GDCLASS(UPNPDevice, RefCounted);
|
||||
|
|
|
|||
|
|
@ -49,6 +49,7 @@
|
|||
#include <execinfo.h>
|
||||
#include <link.h>
|
||||
#include <csignal>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
|
||||
static void handle_crash(int sig) {
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@
|
|||
#include "main/main.h"
|
||||
|
||||
#include <unistd.h>
|
||||
#include <cstdio>
|
||||
|
||||
#if defined(DEBUG_ENABLED)
|
||||
#define CRASH_HANDLER_ENABLED 1
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
#pragma once
|
||||
|
||||
#include "core/object/ref_counted.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
#include "core/variant/type_info.h"
|
||||
|
||||
class Tween;
|
||||
class Node;
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@
|
|||
#include "core/object/ref_counted.h"
|
||||
#include "core/os/thread_safe.h"
|
||||
#include "core/templates/rid.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
#include "core/variant/type_info.h"
|
||||
|
||||
/**
|
||||
The camera server is a singleton object that gives access to the various
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
#pragma once
|
||||
|
||||
#include "core/object/object.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
#include "core/variant/type_info.h"
|
||||
#include "servers/display/accessibility_server_enums.h"
|
||||
#include "servers/display/display_server_enums.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include "core/input/input_enums.h"
|
||||
#include "core/io/image.h"
|
||||
#include "core/io/resource.h"
|
||||
#include "core/object/object.h"
|
||||
|
|
|
|||
|
|
@ -32,8 +32,8 @@
|
|||
|
||||
#include "core/object/object.h"
|
||||
#include "core/os/keyboard.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
#include "core/variant/callable.h"
|
||||
#include "core/variant/type_info.h"
|
||||
|
||||
class Texture2D;
|
||||
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
#pragma once
|
||||
|
||||
#include "core/object/ref_counted.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
#include "core/variant/type_info.h"
|
||||
#include "servers/navigation_2d/navigation_constants_2d.h"
|
||||
|
||||
class NavigationPathQueryParameters2D : public RefCounted {
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
#pragma once
|
||||
|
||||
#include "core/object/ref_counted.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
#include "core/variant/type_info.h"
|
||||
#include "core/variant/typed_array.h"
|
||||
#include "servers/navigation_2d/navigation_constants_2d.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
#pragma once
|
||||
|
||||
#include "core/object/ref_counted.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
#include "core/variant/type_info.h"
|
||||
#include "servers/navigation_3d/navigation_constants_3d.h"
|
||||
|
||||
class NavigationPathQueryParameters3D : public RefCounted {
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
#pragma once
|
||||
|
||||
#include "core/object/ref_counted.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
#include "core/variant/type_info.h"
|
||||
#include "core/variant/typed_array.h"
|
||||
#include "servers/navigation_3d/navigation_constants_3d.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
#include "core/templates/local_vector.h"
|
||||
#include "core/templates/rb_map.h"
|
||||
#include "core/templates/rid_owner.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
#include "core/variant/type_info.h"
|
||||
#include "core/variant/typed_array.h"
|
||||
#include "servers/display/display_server_enums.h"
|
||||
#include "servers/rendering/rendering_device_commons.h"
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@
|
|||
|
||||
#include "core/object/ref_counted.h"
|
||||
#include "core/os/thread_safe.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
#include "core/variant/type_info.h"
|
||||
|
||||
/**
|
||||
The XR interface is a template class on top of which we build interface to different AR, VR and tracking SDKs.
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
#pragma once
|
||||
|
||||
#include "core/object/ref_counted.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
#include "core/variant/type_info.h"
|
||||
|
||||
class XRPose : public RefCounted {
|
||||
GDCLASS(XRPose, RefCounted);
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@
|
|||
|
||||
#include "core/object/ref_counted.h"
|
||||
#include "core/os/thread_safe.h"
|
||||
#include "core/variant/binder_common.h"
|
||||
#include "core/variant/type_info.h"
|
||||
#include "core/variant/variant.h"
|
||||
|
||||
class XRInterface;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue