Compare commits

...

14 Commits

Author SHA1 Message Date
Thaddeus Crews cf9ead3910
Merge f5b340ab69 into 0145e900f3 2024-01-21 01:02:55 -05:00
David Snopek 0145e900f3
Merge pull request #1357 from bruvzg/cpp_64
Switch to 64-bit ints.
2024-01-19 12:15:55 -06:00
David Snopek 6c04514039
Merge pull request #1359 from Naros/GH-1287
Rework GDCLASS macro to allow abstract classes
2024-01-19 07:27:06 -06:00
David Snopek 480a0f8c06
Merge pull request #1360 from AThousandShips/aabb_fix
Fix `AABB.encloses` failing on shared upper bound
2024-01-19 07:26:45 -06:00
Chris Cranford 5f350e2572 Rework GDCLASS macro to allow pure virtual functions 2024-01-18 20:14:13 -05:00
A Thousand Ships 3943e41d2f
Fix `AABB.encloses` failing on shared upper bound 2024-01-12 18:08:40 +01:00
Rémi Verschelde 0ddef6ed96
Merge pull request #1354 from nightblade9/patch-1
Update README.md with basic pre-requisites
2024-01-11 13:11:30 +01:00
Rémi Verschelde 64529361b4
Merge pull request #1351 from Daylily-Zeleen/daylily-zeleen/remove_namespace_in_global_constants_binding
Remove "godot" namespace when binding global constants.
2024-01-11 13:10:51 +01:00
Rémi Verschelde edf1637c2c
Merge pull request #1349 from AThousandShips/op_fix
Add missing `OP_POWER` operator to `Variant`
2024-01-11 13:10:07 +01:00
nightblade9 ee169b201b Update README.md with basic pre-requisites 2024-01-10 15:29:23 -05:00
bruvzg 59a5a8b104
Switch to 64-bit ints. 2024-01-10 15:36:36 +02:00
Daylily-Zeleen bd40a94424 Remove "godot" namespace when binding global constants. 2024-01-07 15:24:02 +08:00
A Thousand Ships f037a697eb
Add missing `OP_POWER` operator to `Variant` 2024-01-06 21:12:52 +01:00
Thaddeus Crews f5b340ab69
Implement typed dictionaries 2023-10-02 11:57:02 -05:00
21 changed files with 2263 additions and 211 deletions

View File

@ -74,7 +74,10 @@ so formatting is done before your changes are submitted.
## Getting started ## Getting started
It's a bit similar to what it was for 3.x but also a bit different. You need the same C++ pre-requisites installed that are required for the `godot` repository. Follow the [official build instructions for your target platform](https://docs.godotengine.org/en/latest/contributing/development/compiling/index.html#building-for-target-platforms).
Getting started with GDExtensions is a bit similar to what it was for 3.x but also a bit different.
This new approach is much more akin to how core Godot modules are structured. This new approach is much more akin to how core Godot modules are structured.
Compiling this repository generates a static library to be linked with your shared lib, Compiling this repository generates a static library to be linked with your shared lib,

View File

@ -422,6 +422,8 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
for include in fully_used_classes: for include in fully_used_classes:
if include == "TypedArray": if include == "TypedArray":
result.append("#include <godot_cpp/variant/typed_array.hpp>") result.append("#include <godot_cpp/variant/typed_array.hpp>")
elif include == "TypedDictionary":
result.append("#include <godot_cpp/variant/typed_dictionary.hpp>")
else: else:
result.append(f"#include <godot_cpp/{get_include_path(include)}>") result.append(f"#include <godot_cpp/{get_include_path(include)}>")
@ -588,17 +590,17 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
# Special cases. # Special cases.
if class_name == "String": if class_name == "String":
result.append("\tstatic String utf8(const char *from, int len = -1);") result.append("\tstatic String utf8(const char *from, int64_t len = -1);")
result.append("\tvoid parse_utf8(const char *from, int len = -1);") result.append("\tvoid parse_utf8(const char *from, int64_t len = -1);")
result.append("\tstatic String utf16(const char16_t *from, int len = -1);") result.append("\tstatic String utf16(const char16_t *from, int64_t len = -1);")
result.append("\tvoid parse_utf16(const char16_t *from, int len = -1);") result.append("\tvoid parse_utf16(const char16_t *from, int64_t len = -1);")
result.append("\tCharString utf8() const;") result.append("\tCharString utf8() const;")
result.append("\tCharString ascii() const;") result.append("\tCharString ascii() const;")
result.append("\tChar16String utf16() const;") result.append("\tChar16String utf16() const;")
result.append("\tChar32String utf32() const;") result.append("\tChar32String utf32() const;")
result.append("\tCharWideString wide_string() const;") result.append("\tCharWideString wide_string() const;")
result.append("\tstatic String num_real(double p_num, bool p_trailing = true);") result.append("\tstatic String num_real(double p_num, bool p_trailing = true);")
result.append("\tError resize(int p_size);") result.append("\tError resize(int64_t p_size);")
if "members" in builtin_api: if "members" in builtin_api:
for member in builtin_api["members"]: for member in builtin_api["members"]:
@ -651,8 +653,8 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
result.append("\tString &operator+=(const wchar_t *p_str);") result.append("\tString &operator+=(const wchar_t *p_str);")
result.append("\tString &operator+=(const char32_t *p_str);") result.append("\tString &operator+=(const char32_t *p_str);")
result.append("\tconst char32_t &operator[](int p_index) const;") result.append("\tconst char32_t &operator[](int64_t p_index) const;")
result.append("\tchar32_t &operator[](int p_index);") result.append("\tchar32_t &operator[](int64_t p_index);")
result.append("\tconst char32_t *ptr() const;") result.append("\tconst char32_t *ptr() const;")
result.append("\tchar32_t *ptrw();") result.append("\tchar32_t *ptrw();")
@ -670,8 +672,8 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
return_type = "int32_t" return_type = "int32_t"
elif class_name == "PackedFloat32Array": elif class_name == "PackedFloat32Array":
return_type = "float" return_type = "float"
result.append(f"\tconst {return_type} &operator[](int p_index) const;") result.append(f"\tconst {return_type} &operator[](int64_t p_index) const;")
result.append(f"\t{return_type} &operator[](int p_index);") result.append(f"\t{return_type} &operator[](int64_t p_index);")
result.append(f"\tconst {return_type} *ptr() const;") result.append(f"\tconst {return_type} *ptr() const;")
result.append(f"\t{return_type} *ptrw();") result.append(f"\t{return_type} *ptrw();")
iterators = """ iterators = """
@ -742,14 +744,17 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
result.append(iterators.replace("$TYPE", return_type)) result.append(iterators.replace("$TYPE", return_type))
if class_name == "Array": if class_name == "Array":
result.append("\tconst Variant &operator[](int p_index) const;") result.append("\tconst Variant &operator[](int64_t p_index) const;")
result.append("\tVariant &operator[](int p_index);") result.append("\tVariant &operator[](int64_t p_index);")
result.append("\tvoid set_typed(uint32_t p_type, const StringName &p_class_name, const Variant &p_script);") result.append("\tvoid set_typed(uint32_t p_type, const StringName &p_class_name, const Variant &p_script);")
result.append("\tvoid _ref(const Array &p_from) const;") result.append("\tvoid _ref(const Array &p_from) const;")
if class_name == "Dictionary": if class_name == "Dictionary":
result.append("\tconst Variant &operator[](const Variant &p_key) const;") result.append("\tconst Variant &operator[](const Variant &p_key) const;")
result.append("\tVariant &operator[](const Variant &p_key);") result.append("\tVariant &operator[](const Variant &p_key);")
result.append(
"\tvoid set_typed(uint32_t p_key_type, const StringName &p_key_class_name, const Variant &p_key_script, uint32_t p_value_type, const StringName &p_value_class_name, const Variant &p_value_script);"
)
result.append("};") result.append("};")
@ -1135,6 +1140,32 @@ def generate_engine_classes_bindings(api, output_dir, use_template_get_node):
fully_used_classes.add(array_type_name) fully_used_classes.add(array_type_name)
else: else:
used_classes.add(array_type_name) used_classes.add(array_type_name)
elif type_name.startswith("typeddictionary::"):
fully_used_classes.add("TypedDictionary")
dict_type_name = type_name.replace("typeddictionary::", "")
if dict_type_name.startswith("const "):
dict_type_name = dict_type_name[6:]
dict_type_names = dict_type_name.split(",")
dict_type_name = dict_type_names[0]
if dict_type_name.endswith("*"):
dict_type_name = dict_type_name[:-1]
if is_included(dict_type_name, class_name):
if is_enum(dict_type_name):
fully_used_classes.add(get_enum_class(dict_type_name))
elif "default_value" in argument:
fully_used_classes.add(dict_type_name)
else:
used_classes.add(dict_type_name)
dict_type_name = dict_type_names[2]
if dict_type_name.endswith("*"):
dict_type_name = dict_type_name[:-1]
if is_included(dict_type_name, class_name):
if is_enum(dict_type_name):
fully_used_classes.add(get_enum_class(dict_type_name))
elif "default_value" in argument:
fully_used_classes.add(dict_type_name)
else:
used_classes.add(dict_type_name)
elif is_enum(type_name): elif is_enum(type_name):
fully_used_classes.add(get_enum_class(type_name)) fully_used_classes.add(get_enum_class(type_name))
elif "default_value" in argument: elif "default_value" in argument:
@ -1164,6 +1195,32 @@ def generate_engine_classes_bindings(api, output_dir, use_template_get_node):
fully_used_classes.add(array_type_name) fully_used_classes.add(array_type_name)
else: else:
used_classes.add(array_type_name) used_classes.add(array_type_name)
elif type_name.startswith("typeddictionary::"):
fully_used_classes.add("TypedDictionary")
dict_type_name = type_name.replace("typeddictionary::", "")
if dict_type_name.startswith("const "):
dict_type_name = dict_type_name[6:]
dict_type_names = dict_type_name.split(",")
dict_type_name = dict_type_names[0]
if dict_type_name.endswith("*"):
dict_type_name = dict_type_name[:-1]
if is_included(dict_type_name, class_name):
if is_enum(dict_type_name):
fully_used_classes.add(get_enum_class(dict_type_name))
elif is_variant(dict_type_name):
fully_used_classes.add(dict_type_name)
else:
used_classes.add(dict_type_name)
dict_type_name = dict_type_names[2]
if dict_type_name.endswith("*"):
dict_type_name = dict_type_name[:-1]
if is_included(dict_type_name, class_name):
if is_enum(dict_type_name):
fully_used_classes.add(get_enum_class(dict_type_name))
elif is_variant(dict_type_name):
fully_used_classes.add(dict_type_name)
else:
used_classes.add(dict_type_name)
elif is_enum(type_name): elif is_enum(type_name):
fully_used_classes.add(get_enum_class(type_name)) fully_used_classes.add(get_enum_class(type_name))
elif is_variant(type_name): elif is_variant(type_name):
@ -1288,6 +1345,8 @@ def generate_engine_class_header(class_api, used_classes, fully_used_classes, us
for included in fully_used_classes: for included in fully_used_classes:
if included == "TypedArray": if included == "TypedArray":
result.append("#include <godot_cpp/variant/typed_array.hpp>") result.append("#include <godot_cpp/variant/typed_array.hpp>")
elif included == "TypedDictionary":
result.append("#include <godot_cpp/variant/typed_dictionary.hpp>")
else: else:
result.append(f"#include <godot_cpp/{get_include_path(included)}>") result.append(f"#include <godot_cpp/{get_include_path(included)}>")
@ -1696,7 +1755,7 @@ def generate_global_constants(api, output_dir):
header.append("") header.append("")
for constant in api["global_constants"]: for constant in api["global_constants"]:
header.append(f'\tconst int {escape_identifier(constant["name"])} = {constant["value"]};') header.append(f'\tconst int64_t {escape_identifier(constant["name"])} = {constant["value"]};')
header.append("") header.append("")
@ -1778,9 +1837,9 @@ def generate_global_constant_binds(api, output_dir):
continue continue
if enum_def["is_bitfield"]: if enum_def["is_bitfield"]:
header.append(f'VARIANT_BITFIELD_CAST(godot::{enum_def["name"]});') header.append(f'VARIANT_BITFIELD_CAST({enum_def["name"]});')
else: else:
header.append(f'VARIANT_ENUM_CAST(godot::{enum_def["name"]});') header.append(f'VARIANT_ENUM_CAST({enum_def["name"]});')
# Variant::Type is not a global enum, but only one line, it is worth to place in this file instead of creating new file. # Variant::Type is not a global enum, but only one line, it is worth to place in this file instead of creating new file.
header.append(f"VARIANT_ENUM_CAST(godot::Variant::Type);") header.append(f"VARIANT_ENUM_CAST(godot::Variant::Type);")
@ -2283,6 +2342,7 @@ def is_variant(type_name):
or type_name in builtin_classes or type_name in builtin_classes
or type_name == "Nil" or type_name == "Nil"
or type_name.startswith("typedarray::") or type_name.startswith("typedarray::")
or type_name.startswith("typeddictionary::")
) )
@ -2308,6 +2368,8 @@ def is_included(type_name, current_type):
""" """
if type_name.startswith("typedarray::"): if type_name.startswith("typedarray::"):
return True return True
if type_name.startswith("typeddictionary::"):
return True
to_include = get_enum_class(type_name) if is_enum(type_name) else type_name to_include = get_enum_class(type_name) if is_enum(type_name) else type_name
if to_include == current_type or is_pod_type(to_include): if to_include == current_type or is_pod_type(to_include):
return False return False
@ -2341,6 +2403,12 @@ def correct_typed_array(type_name):
return type_name return type_name
def correct_typed_dictionary(type_name):
if type_name.startswith("typeddictionary::"):
return type_name.replace("typeddictionary::", "TypedDictionary<").replace(",", ", ") + ">"
return type_name
def correct_type(type_name, meta=None): def correct_type(type_name, meta=None):
type_conversion = {"float": "double", "int": "int64_t", "Nil": "Variant"} type_conversion = {"float": "double", "int": "int64_t", "Nil": "Variant"}
if meta != None: if meta != None:
@ -2354,6 +2422,8 @@ def correct_type(type_name, meta=None):
return type_conversion[type_name] return type_conversion[type_name]
if type_name.startswith("typedarray::"): if type_name.startswith("typedarray::"):
return type_name.replace("typedarray::", "TypedArray<") + ">" return type_name.replace("typedarray::", "TypedArray<") + ">"
if type_name.startswith("typeddictionary::"):
return type_name.replace("typeddictionary::", "TypedDictionary<").replace(",", ", ") + ">"
if is_enum(type_name): if is_enum(type_name):
if is_bitfield(type_name): if is_bitfield(type_name):
base_class = get_enum_class(type_name) base_class = get_enum_class(type_name)
@ -2433,6 +2503,7 @@ def get_operator_id_name(op):
"unary-": "negate", "unary-": "negate",
"unary+": "positive", "unary+": "positive",
"%": "module", "%": "module",
"**": "power",
"<<": "shift_left", "<<": "shift_left",
">>": "shift_right", ">>": "shift_right",
"&": "bit_and", "&": "bit_and",
@ -2458,6 +2529,8 @@ def get_default_value_for_type(type_name):
return "false" return "false"
if type_name.startswith("typedarray::"): if type_name.startswith("typedarray::"):
return f"{correct_type(type_name)}()" return f"{correct_type(type_name)}()"
if type_name.startswith("typeddictionary::"):
return f"{correct_type(type_name)}()"
if is_enum(type_name): if is_enum(type_name):
return f"{correct_type(type_name)}(0)" return f"{correct_type(type_name)}(0)"
if is_variant(type_name): if is_variant(type_name):

View File

@ -2115,6 +2115,33 @@ typedef GDExtensionVariantPtr (*GDExtensionInterfaceDictionaryOperatorIndex)(GDE
*/ */
typedef GDExtensionVariantPtr (*GDExtensionInterfaceDictionaryOperatorIndexConst)(GDExtensionConstTypePtr p_self, GDExtensionConstVariantPtr p_key); typedef GDExtensionVariantPtr (*GDExtensionInterfaceDictionaryOperatorIndexConst)(GDExtensionConstTypePtr p_self, GDExtensionConstVariantPtr p_key);
/**
* @name dictionary_ref
* @since 4.2
*
* Sets a Dictionary to be a reference to another Dictionary object.
*
* @param p_self A pointer to the Dictionary object to update.
* @param p_from A pointer to the Dictionary object to reference.
*/
typedef void (*GDExtensionInterfaceDictionaryRef)(GDExtensionTypePtr p_self, GDExtensionConstTypePtr p_from);
/**
* @name dictionary_set_typed
* @since 4.2
*
* Makes a Dictionary into a typed Dictionary.
*
* @param p_self A pointer to the Dictionary.
* @param p_key_type The type of Variant the Dictionary key will store.
* @param p_key_class_name A pointer to a StringName with the name of the object (if p_key_type is GDEXTENSION_VARIANT_TYPE_OBJECT).
* @param p_key_script A pointer to a Script object (if p_key_type is GDEXTENSION_VARIANT_TYPE_OBJECT and the base class is extended by a script).
* @param p_value_type The type of Variant the Dictionary value will store.
* @param p_value_class_name A pointer to a StringName with the name of the object (if p_value_type is GDEXTENSION_VARIANT_TYPE_OBJECT).
* @param p_value_script A pointer to a Script object (if p_value_type is GDEXTENSION_VARIANT_TYPE_OBJECT and the base class is extended by a script).
*/
typedef void (*GDExtensionInterfaceDictionarySetTyped)(GDExtensionTypePtr p_self, GDExtensionVariantType p_key_type, GDExtensionConstStringNamePtr p_key_class_name, GDExtensionConstVariantPtr p_key_script, GDExtensionVariantType p_value_type, GDExtensionConstStringNamePtr p_value_class_name, GDExtensionConstVariantPtr p_value_script);
/* INTERFACE: Object */ /* INTERFACE: Object */
/** /**

View File

@ -48,6 +48,7 @@ typedef void GodotObject;
// Base for all engine classes, to contain the pointer to the engine instance. // Base for all engine classes, to contain the pointer to the engine instance.
class Wrapped { class Wrapped {
friend class GDExtensionBinding; friend class GDExtensionBinding;
friend class ClassDB;
friend void postinitialize_handler(Wrapped *); friend void postinitialize_handler(Wrapped *);
protected: protected:
@ -131,17 +132,6 @@ struct EngineClassRegistration {
} // namespace godot } // namespace godot
#ifdef HOT_RELOAD_ENABLED
#define _GDCLASS_RECREATE(m_class, m_inherits) \
m_class *new_instance = (m_class *)memalloc(sizeof(m_class)); \
Wrapped::RecreateInstance recreate_data = { new_instance, obj, Wrapped::recreate_instance }; \
Wrapped::recreate_instance = &recreate_data; \
memnew_placement(new_instance, m_class); \
return new_instance;
#else
#define _GDCLASS_RECREATE(m_class, m_inherits) return nullptr;
#endif
// Use this on top of your own classes. // Use this on top of your own classes.
// Note: the trail of `***` is to keep sane diffs in PRs, because clang-format otherwise moves every `\` which makes // Note: the trail of `***` is to keep sane diffs in PRs, because clang-format otherwise moves every `\` which makes
// every line of the macro different // every line of the macro different
@ -226,15 +216,6 @@ public:
return m_inherits::get_class_static(); \ return m_inherits::get_class_static(); \
} \ } \
\ \
static GDExtensionObjectPtr create(void *data) { \
m_class *new_object = memnew(m_class); \
return new_object->_owner; \
} \
\
static GDExtensionClassInstancePtr recreate(void *data, GDExtensionObjectPtr obj) { \
_GDCLASS_RECREATE(m_class, m_inherits); \
} \
\
static void notification_bind(GDExtensionClassInstancePtr p_instance, int32_t p_what, GDExtensionBool p_reversed) { \ static void notification_bind(GDExtensionClassInstancePtr p_instance, int32_t p_what, GDExtensionBool p_reversed) { \
if (p_instance && m_class::_get_notification()) { \ if (p_instance && m_class::_get_notification()) { \
if (m_class::_get_notification() != m_inherits::_get_notification()) { \ if (m_class::_get_notification() != m_inherits::_get_notification()) { \
@ -437,14 +418,6 @@ public:
return m_inherits::get_class_static(); \ return m_inherits::get_class_static(); \
} \ } \
\ \
static GDExtensionObjectPtr create(void *data) { \
return nullptr; \
} \
\
static GDExtensionClassInstancePtr recreate(void *data, GDExtensionObjectPtr obj) { \
return nullptr; \
} \
\
static void free(void *data, GDExtensionClassInstancePtr ptr) { \ static void free(void *data, GDExtensionClassInstancePtr ptr) { \
} \ } \
\ \

View File

@ -112,6 +112,33 @@ private:
template <class T, bool is_abstract> template <class T, bool is_abstract>
static void _register_class(bool p_virtual = false, bool p_exposed = true); static void _register_class(bool p_virtual = false, bool p_exposed = true);
template <class T>
static GDExtensionObjectPtr _create_instance_func(void *data) {
if constexpr (!std::is_abstract_v<T>) {
T *new_object = memnew(T);
return new_object->_owner;
} else {
return nullptr;
}
}
template <class T>
static GDExtensionClassInstancePtr _recreate_instance_func(void *data, GDExtensionObjectPtr obj) {
if constexpr (!std::is_abstract_v<T>) {
#ifdef HOT_RELOAD_ENABLED
T *new_instance = (T *)memalloc(sizeof(T));
Wrapped::RecreateInstance recreate_data = { new_instance, obj, Wrapped::recreate_instance };
Wrapped::recreate_instance = &recreate_data;
memnew_placement(new_instance, T);
return new_instance;
#else
return nullptr;
#endif
} else {
return nullptr;
}
}
public: public:
template <class T> template <class T>
static void register_class(bool p_virtual = false); static void register_class(bool p_virtual = false);
@ -202,9 +229,9 @@ void ClassDB::_register_class(bool p_virtual, bool p_exposed) {
T::to_string_bind, // GDExtensionClassToString to_string_func; T::to_string_bind, // GDExtensionClassToString to_string_func;
nullptr, // GDExtensionClassReference reference_func; nullptr, // GDExtensionClassReference reference_func;
nullptr, // GDExtensionClassUnreference unreference_func; nullptr, // GDExtensionClassUnreference unreference_func;
T::create, // GDExtensionClassCreateInstance create_instance_func; /* this one is mandatory */ &_create_instance_func<T>, // GDExtensionClassCreateInstance create_instance_func; /* this one is mandatory */
T::free, // GDExtensionClassFreeInstance free_instance_func; /* this one is mandatory */ T::free, // GDExtensionClassFreeInstance free_instance_func; /* this one is mandatory */
T::recreate, // GDExtensionClassRecreateInstance recreate_instance_func; &_recreate_instance_func<T>, // GDExtensionClassRecreateInstance recreate_instance_func;
&ClassDB::get_virtual_func, // GDExtensionClassGetVirtual get_virtual_func; &ClassDB::get_virtual_func, // GDExtensionClassGetVirtual get_virtual_func;
nullptr, // GDExtensionClassGetVirtualCallData get_virtual_call_data_func; nullptr, // GDExtensionClassGetVirtualCallData get_virtual_call_data_func;
nullptr, // GDExtensionClassCallVirtualWithData call_virtual_func; nullptr, // GDExtensionClassCallVirtualWithData call_virtual_func;

View File

@ -33,6 +33,7 @@
#include <godot_cpp/core/object.hpp> #include <godot_cpp/core/object.hpp>
#include <godot_cpp/variant/typed_array.hpp> #include <godot_cpp/variant/typed_array.hpp>
#include <godot_cpp/variant/typed_dictionary.hpp>
#include <godot_cpp/variant/variant.hpp> #include <godot_cpp/variant/variant.hpp>
#include <gdextension_interface.h> #include <gdextension_interface.h>
@ -395,6 +396,726 @@ MAKE_TYPED_ARRAY_INFO(Vector<Vector3>, Variant::PACKED_VECTOR3_ARRAY)
MAKE_TYPED_ARRAY_INFO(Vector<Color>, Variant::PACKED_COLOR_ARRAY) MAKE_TYPED_ARRAY_INFO(Vector<Color>, Variant::PACKED_COLOR_ARRAY)
*/ */
template <class TKey, class TValue>
struct PtrToArg<TypedDictionary<TKey, TValue>> {
_FORCE_INLINE_ static TypedDictionary<TKey, TValue> convert(const void *p_ptr) {
return TypedDictionary<TKey, TValue>(*reinterpret_cast<const Dictionary *>(p_ptr));
}
typedef Dictionary EncodeT;
_FORCE_INLINE_ static void encode(TypedDictionary<TKey, TValue> p_val, void *p_ptr) {
*reinterpret_cast<Dictionary *>(p_ptr) = p_val;
}
};
template <class TKey, class TValue>
struct PtrToArg<const TypedDictionary<TKey, TValue> &> {
typedef Dictionary EncodeT;
_FORCE_INLINE_ static TypedDictionary<TKey, TValue>
convert(const void *p_ptr) {
return TypedDictionary<TKey, TValue>(*reinterpret_cast<const Dictionary *>(p_ptr));
}
};
template <class TKey, class TValue>
struct GetTypeInfo<TypedDictionary<TKey, TValue>> {
static constexpr GDExtensionVariantType VARIANT_TYPE = GDEXTENSION_VARIANT_TYPE_DICTIONARY;
static constexpr GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE;
static inline PropertyInfo get_class_info() {
return make_property_info(Variant::Type::DICTIONARY, "", PROPERTY_HINT_DICTIONARY_TYPE, vformat("%s,%s", TKey::get_class_static(), TValue::get_class_static()));
}
};
template <class TKey, class TValue>
struct GetTypeInfo<const TypedDictionary<TKey, TValue> &> {
static constexpr GDExtensionVariantType VARIANT_TYPE = GDEXTENSION_VARIANT_TYPE_DICTIONARY;
static constexpr GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE;
static inline PropertyInfo get_class_info() {
return make_property_info(Variant::Type::DICTIONARY, "", PROPERTY_HINT_DICTIONARY_TYPE, vformat("%s,%s", TKey::get_class_static(), TValue::get_class_static()));
}
};
#define MAKE_TYPED_DICTIONARY_INFO(m_type, m_variant_type) \
template <> \
struct GetTypeInfo<TypedDictionary<m_type, m_type>> { \
static constexpr GDExtensionVariantType VARIANT_TYPE = GDEXTENSION_VARIANT_TYPE_DICTIONARY; \
static constexpr GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE; \
static inline PropertyInfo get_class_info() { \
return make_property_info(Variant::Type::DICTIONARY, "", PROPERTY_HINT_DICTIONARY_TYPE, vformat("%s,%s", Variant::get_type_name(m_variant_type).utf8().get_data(), Variant::get_type_name(m_variant_type).utf8().get_data())); \
} \
}; \
template <> \
struct GetTypeInfo<const TypedDictionary<m_type, m_type> &> { \
static constexpr GDExtensionVariantType VARIANT_TYPE = GDEXTENSION_VARIANT_TYPE_DICTIONARY; \
static constexpr GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE; \
static inline PropertyInfo get_class_info() { \
return make_property_info(Variant::Type::DICTIONARY, "", PROPERTY_HINT_DICTIONARY_TYPE, vformat("%s,%s", Variant::get_type_name(m_variant_type).utf8().get_data(), Variant::get_type_name(m_variant_type).utf8().get_data())); \
} \
};
#define MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(m_type, m_variant_type) \
template <class T> \
struct GetTypeInfo<TypedDictionary<T, m_type>> { \
static constexpr GDExtensionVariantType VARIANT_TYPE = GDEXTENSION_VARIANT_TYPE_DICTIONARY; \
static constexpr GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE; \
static inline PropertyInfo get_class_info() { \
return make_property_info(Variant::Type::DICTIONARY, "", PROPERTY_HINT_DICTIONARY_TYPE, vformat("%s,%s", T::get_class_static(), Variant::get_type_name(m_variant_type).utf8().get_data())); \
} \
}; \
template <class T> \
struct GetTypeInfo<const TypedDictionary<T, m_type> &> { \
static constexpr GDExtensionVariantType VARIANT_TYPE = GDEXTENSION_VARIANT_TYPE_DICTIONARY; \
static constexpr GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE; \
static inline PropertyInfo get_class_info() { \
return make_property_info(Variant::Type::DICTIONARY, "", PROPERTY_HINT_DICTIONARY_TYPE, vformat("%s,%s", T::get_class_static(), Variant::get_type_name(m_variant_type).utf8().get_data())); \
} \
}; \
template <class T> \
struct GetTypeInfo<TypedDictionary<m_type, T>> { \
static constexpr GDExtensionVariantType VARIANT_TYPE = GDEXTENSION_VARIANT_TYPE_DICTIONARY; \
static constexpr GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE; \
static inline PropertyInfo get_class_info() { \
return make_property_info(Variant::Type::DICTIONARY, "", PROPERTY_HINT_DICTIONARY_TYPE, vformat("%s,%s", Variant::get_type_name(m_variant_type).utf8().get_data(), T::get_class_static())); \
} \
}; \
template <class T> \
struct GetTypeInfo<const TypedDictionary<m_type, T> &> { \
static constexpr GDExtensionVariantType VARIANT_TYPE = GDEXTENSION_VARIANT_TYPE_DICTIONARY; \
static constexpr GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE; \
static inline PropertyInfo get_class_info() { \
return make_property_info(Variant::Type::DICTIONARY, "", PROPERTY_HINT_DICTIONARY_TYPE, vformat("%s,%s", Variant::get_type_name(m_variant_type).utf8().get_data(), T::get_class_static())); \
} \
};
#define MAKE_TYPED_DICTIONARY_EXPANDED_INFO(m_type_a, m_variant_type_a, m_type_b, m_variant_type_b) \
template <> \
struct GetTypeInfo<TypedDictionary<m_type_a, m_type_b>> { \
static constexpr GDExtensionVariantType VARIANT_TYPE = GDEXTENSION_VARIANT_TYPE_DICTIONARY; \
static constexpr GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE; \
static inline PropertyInfo get_class_info() { \
return make_property_info(Variant::Type::DICTIONARY, "", PROPERTY_HINT_DICTIONARY_TYPE, vformat("%s,%s", Variant::get_type_name(m_variant_type_a).utf8().get_data(), Variant::get_type_name(m_variant_type_b).utf8().get_data())); \
} \
}; \
template <> \
struct GetTypeInfo<const TypedDictionary<m_type_a, m_type_b> &> { \
static constexpr GDExtensionVariantType VARIANT_TYPE = GDEXTENSION_VARIANT_TYPE_DICTIONARY; \
static constexpr GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE; \
static inline PropertyInfo get_class_info() { \
return make_property_info(Variant::Type::DICTIONARY, "", PROPERTY_HINT_DICTIONARY_TYPE, vformat("%s,%s", Variant::get_type_name(m_variant_type_a).utf8().get_data(), Variant::get_type_name(m_variant_type_b).utf8().get_data())); \
} \
}; \
template <> \
struct GetTypeInfo<TypedDictionary<m_type_b, m_type_a>> { \
static constexpr GDExtensionVariantType VARIANT_TYPE = GDEXTENSION_VARIANT_TYPE_DICTIONARY; \
static constexpr GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE; \
static inline PropertyInfo get_class_info() { \
return make_property_info(Variant::Type::DICTIONARY, "", PROPERTY_HINT_DICTIONARY_TYPE, vformat("%s,%s", Variant::get_type_name(m_variant_type_b).utf8().get_data(), Variant::get_type_name(m_variant_type_a).utf8().get_data())); \
} \
}; \
template <> \
struct GetTypeInfo<const TypedDictionary<m_type_b, m_type_a> &> { \
static constexpr GDExtensionVariantType VARIANT_TYPE = GDEXTENSION_VARIANT_TYPE_DICTIONARY; \
static constexpr GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE; \
static inline PropertyInfo get_class_info() { \
return make_property_info(Variant::Type::DICTIONARY, "", PROPERTY_HINT_DICTIONARY_TYPE, vformat("%s,%s", Variant::get_type_name(m_variant_type_b).utf8().get_data(), Variant::get_type_name(m_variant_type_a).utf8().get_data())); \
} \
};
MAKE_TYPED_DICTIONARY_INFO(bool, Variant::BOOL)
MAKE_TYPED_DICTIONARY_INFO(uint8_t, Variant::INT)
MAKE_TYPED_DICTIONARY_INFO(int8_t, Variant::INT)
MAKE_TYPED_DICTIONARY_INFO(uint16_t, Variant::INT)
MAKE_TYPED_DICTIONARY_INFO(int16_t, Variant::INT)
MAKE_TYPED_DICTIONARY_INFO(uint32_t, Variant::INT)
MAKE_TYPED_DICTIONARY_INFO(int32_t, Variant::INT)
MAKE_TYPED_DICTIONARY_INFO(uint64_t, Variant::INT)
MAKE_TYPED_DICTIONARY_INFO(int64_t, Variant::INT)
MAKE_TYPED_DICTIONARY_INFO(float, Variant::FLOAT)
MAKE_TYPED_DICTIONARY_INFO(double, Variant::FLOAT)
MAKE_TYPED_DICTIONARY_INFO(String, Variant::STRING)
MAKE_TYPED_DICTIONARY_INFO(Vector2, Variant::VECTOR2)
MAKE_TYPED_DICTIONARY_INFO(Vector2i, Variant::VECTOR2I)
MAKE_TYPED_DICTIONARY_INFO(Rect2, Variant::RECT2)
MAKE_TYPED_DICTIONARY_INFO(Rect2i, Variant::RECT2I)
MAKE_TYPED_DICTIONARY_INFO(Vector3, Variant::VECTOR3)
MAKE_TYPED_DICTIONARY_INFO(Vector3i, Variant::VECTOR3I)
MAKE_TYPED_DICTIONARY_INFO(Transform2D, Variant::TRANSFORM2D)
MAKE_TYPED_DICTIONARY_INFO(Plane, Variant::PLANE)
MAKE_TYPED_DICTIONARY_INFO(Quaternion, Variant::QUATERNION)
MAKE_TYPED_DICTIONARY_INFO(AABB, Variant::AABB)
MAKE_TYPED_DICTIONARY_INFO(Basis, Variant::BASIS)
MAKE_TYPED_DICTIONARY_INFO(Transform3D, Variant::TRANSFORM3D)
MAKE_TYPED_DICTIONARY_INFO(Color, Variant::COLOR)
MAKE_TYPED_DICTIONARY_INFO(StringName, Variant::STRING_NAME)
MAKE_TYPED_DICTIONARY_INFO(NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_INFO(RID, Variant::RID)
MAKE_TYPED_DICTIONARY_INFO(Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_INFO(Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_INFO(Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_INFO(Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(Variant, Variant::NIL)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(bool, Variant::BOOL)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(uint8_t, Variant::INT)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(int8_t, Variant::INT)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(uint16_t, Variant::INT)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(int16_t, Variant::INT)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(uint32_t, Variant::INT)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(int32_t, Variant::INT)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(uint64_t, Variant::INT)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(int64_t, Variant::INT)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(float, Variant::FLOAT)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(double, Variant::FLOAT)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(String, Variant::STRING)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(Vector2, Variant::VECTOR2)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(Vector2i, Variant::VECTOR2I)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(Rect2, Variant::RECT2)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(Rect2i, Variant::RECT2I)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(Vector3, Variant::VECTOR3)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(Vector3i, Variant::VECTOR3I)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(Transform2D, Variant::TRANSFORM2D)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(Plane, Variant::PLANE)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(Quaternion, Variant::QUATERNION)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(AABB, Variant::AABB)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(Basis, Variant::BASIS)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(Transform3D, Variant::TRANSFORM3D)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(Color, Variant::COLOR)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(StringName, Variant::STRING_NAME)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(RID, Variant::RID)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_WITH_OBJECT_INFO(Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, bool, Variant::BOOL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, uint8_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, int8_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, uint16_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, int16_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, uint32_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, int32_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, uint64_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, int64_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, float, Variant::FLOAT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, double, Variant::FLOAT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, String, Variant::STRING)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, Vector2, Variant::VECTOR2)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, Vector2i, Variant::VECTOR2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, Rect2, Variant::RECT2)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, Rect2i, Variant::RECT2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, Vector3, Variant::VECTOR3)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, Vector3i, Variant::VECTOR3I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, Transform2D, Variant::TRANSFORM2D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, Plane, Variant::PLANE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, Quaternion, Variant::QUATERNION)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, AABB, Variant::AABB)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, Basis, Variant::BASIS)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, Transform3D, Variant::TRANSFORM3D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, Color, Variant::COLOR)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, StringName, Variant::STRING_NAME)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, RID, Variant::RID)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Variant, Variant::NIL, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, uint8_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, int8_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, uint16_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, int16_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, uint32_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, int32_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, uint64_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, int64_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, float, Variant::FLOAT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, double, Variant::FLOAT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, String, Variant::STRING)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, Vector2, Variant::VECTOR2)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, Vector2i, Variant::VECTOR2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, Rect2, Variant::RECT2)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, Rect2i, Variant::RECT2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, Vector3, Variant::VECTOR3)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, Vector3i, Variant::VECTOR3I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, Transform2D, Variant::TRANSFORM2D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, Plane, Variant::PLANE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, Quaternion, Variant::QUATERNION)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, AABB, Variant::AABB)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, Basis, Variant::BASIS)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, Transform3D, Variant::TRANSFORM3D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, Color, Variant::COLOR)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, StringName, Variant::STRING_NAME)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, RID, Variant::RID)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(bool, Variant::BOOL, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, int8_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, uint16_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, int16_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, uint32_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, int32_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, uint64_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, int64_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, float, Variant::FLOAT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, double, Variant::FLOAT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, String, Variant::STRING)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, Vector2, Variant::VECTOR2)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, Vector2i, Variant::VECTOR2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, Rect2, Variant::RECT2)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, Rect2i, Variant::RECT2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, Vector3, Variant::VECTOR3)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, Vector3i, Variant::VECTOR3I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, Transform2D, Variant::TRANSFORM2D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, Plane, Variant::PLANE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, Quaternion, Variant::QUATERNION)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, AABB, Variant::AABB)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, Basis, Variant::BASIS)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, Transform3D, Variant::TRANSFORM3D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, Color, Variant::COLOR)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, StringName, Variant::STRING_NAME)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, RID, Variant::RID)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint8_t, Variant::INT, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, uint16_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, int16_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, uint32_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, int32_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, uint64_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, int64_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, float, Variant::FLOAT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, double, Variant::FLOAT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, String, Variant::STRING)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, Vector2, Variant::VECTOR2)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, Vector2i, Variant::VECTOR2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, Rect2, Variant::RECT2)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, Rect2i, Variant::RECT2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, Vector3, Variant::VECTOR3)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, Vector3i, Variant::VECTOR3I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, Transform2D, Variant::TRANSFORM2D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, Plane, Variant::PLANE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, Quaternion, Variant::QUATERNION)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, AABB, Variant::AABB)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, Basis, Variant::BASIS)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, Transform3D, Variant::TRANSFORM3D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, Color, Variant::COLOR)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, StringName, Variant::STRING_NAME)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, RID, Variant::RID)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int8_t, Variant::INT, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint16_t, Variant::INT, int16_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint16_t, Variant::INT, uint32_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint16_t, Variant::INT, int32_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint16_t, Variant::INT, uint64_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint16_t, Variant::INT, int64_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint16_t, Variant::INT, float, Variant::FLOAT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint16_t, Variant::INT, double, Variant::FLOAT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint16_t, Variant::INT, String, Variant::STRING)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint16_t, Variant::INT, Vector2, Variant::VECTOR2)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint16_t, Variant::INT, Vector2i, Variant::VECTOR2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint16_t, Variant::INT, Rect2, Variant::RECT2)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint16_t, Variant::INT, Rect2i, Variant::RECT2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint16_t, Variant::INT, Vector3, Variant::VECTOR3)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint16_t, Variant::INT, Vector3i, Variant::VECTOR3I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint16_t, Variant::INT, Transform2D, Variant::TRANSFORM2D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint16_t, Variant::INT, Plane, Variant::PLANE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint16_t, Variant::INT, Quaternion, Variant::QUATERNION)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint16_t, Variant::INT, AABB, Variant::AABB)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint16_t, Variant::INT, Basis, Variant::BASIS)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint16_t, Variant::INT, Transform3D, Variant::TRANSFORM3D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint16_t, Variant::INT, Color, Variant::COLOR)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint16_t, Variant::INT, StringName, Variant::STRING_NAME)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint16_t, Variant::INT, NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint16_t, Variant::INT, RID, Variant::RID)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint16_t, Variant::INT, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint16_t, Variant::INT, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint16_t, Variant::INT, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint16_t, Variant::INT, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int16_t, Variant::INT, uint32_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int16_t, Variant::INT, int32_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int16_t, Variant::INT, uint64_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int16_t, Variant::INT, int64_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int16_t, Variant::INT, float, Variant::FLOAT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int16_t, Variant::INT, double, Variant::FLOAT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int16_t, Variant::INT, String, Variant::STRING)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int16_t, Variant::INT, Vector2, Variant::VECTOR2)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int16_t, Variant::INT, Vector2i, Variant::VECTOR2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int16_t, Variant::INT, Rect2, Variant::RECT2)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int16_t, Variant::INT, Rect2i, Variant::RECT2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int16_t, Variant::INT, Vector3, Variant::VECTOR3)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int16_t, Variant::INT, Vector3i, Variant::VECTOR3I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int16_t, Variant::INT, Transform2D, Variant::TRANSFORM2D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int16_t, Variant::INT, Plane, Variant::PLANE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int16_t, Variant::INT, Quaternion, Variant::QUATERNION)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int16_t, Variant::INT, AABB, Variant::AABB)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int16_t, Variant::INT, Basis, Variant::BASIS)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int16_t, Variant::INT, Transform3D, Variant::TRANSFORM3D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int16_t, Variant::INT, Color, Variant::COLOR)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int16_t, Variant::INT, StringName, Variant::STRING_NAME)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int16_t, Variant::INT, NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int16_t, Variant::INT, RID, Variant::RID)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int16_t, Variant::INT, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int16_t, Variant::INT, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int16_t, Variant::INT, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int16_t, Variant::INT, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint32_t, Variant::INT, int32_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint32_t, Variant::INT, uint64_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint32_t, Variant::INT, int64_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint32_t, Variant::INT, float, Variant::FLOAT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint32_t, Variant::INT, double, Variant::FLOAT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint32_t, Variant::INT, String, Variant::STRING)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint32_t, Variant::INT, Vector2, Variant::VECTOR2)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint32_t, Variant::INT, Vector2i, Variant::VECTOR2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint32_t, Variant::INT, Rect2, Variant::RECT2)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint32_t, Variant::INT, Rect2i, Variant::RECT2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint32_t, Variant::INT, Vector3, Variant::VECTOR3)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint32_t, Variant::INT, Vector3i, Variant::VECTOR3I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint32_t, Variant::INT, Transform2D, Variant::TRANSFORM2D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint32_t, Variant::INT, Plane, Variant::PLANE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint32_t, Variant::INT, Quaternion, Variant::QUATERNION)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint32_t, Variant::INT, AABB, Variant::AABB)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint32_t, Variant::INT, Basis, Variant::BASIS)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint32_t, Variant::INT, Transform3D, Variant::TRANSFORM3D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint32_t, Variant::INT, Color, Variant::COLOR)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint32_t, Variant::INT, StringName, Variant::STRING_NAME)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint32_t, Variant::INT, NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint32_t, Variant::INT, RID, Variant::RID)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint32_t, Variant::INT, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint32_t, Variant::INT, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint32_t, Variant::INT, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint32_t, Variant::INT, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int32_t, Variant::INT, uint64_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int32_t, Variant::INT, int64_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int32_t, Variant::INT, float, Variant::FLOAT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int32_t, Variant::INT, double, Variant::FLOAT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int32_t, Variant::INT, String, Variant::STRING)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int32_t, Variant::INT, Vector2, Variant::VECTOR2)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int32_t, Variant::INT, Vector2i, Variant::VECTOR2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int32_t, Variant::INT, Rect2, Variant::RECT2)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int32_t, Variant::INT, Rect2i, Variant::RECT2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int32_t, Variant::INT, Vector3, Variant::VECTOR3)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int32_t, Variant::INT, Vector3i, Variant::VECTOR3I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int32_t, Variant::INT, Transform2D, Variant::TRANSFORM2D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int32_t, Variant::INT, Plane, Variant::PLANE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int32_t, Variant::INT, Quaternion, Variant::QUATERNION)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int32_t, Variant::INT, AABB, Variant::AABB)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int32_t, Variant::INT, Basis, Variant::BASIS)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int32_t, Variant::INT, Transform3D, Variant::TRANSFORM3D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int32_t, Variant::INT, Color, Variant::COLOR)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int32_t, Variant::INT, StringName, Variant::STRING_NAME)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int32_t, Variant::INT, NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int32_t, Variant::INT, RID, Variant::RID)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int32_t, Variant::INT, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int32_t, Variant::INT, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int32_t, Variant::INT, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int32_t, Variant::INT, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint64_t, Variant::INT, int64_t, Variant::INT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint64_t, Variant::INT, float, Variant::FLOAT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint64_t, Variant::INT, double, Variant::FLOAT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint64_t, Variant::INT, String, Variant::STRING)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint64_t, Variant::INT, Vector2, Variant::VECTOR2)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint64_t, Variant::INT, Vector2i, Variant::VECTOR2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint64_t, Variant::INT, Rect2, Variant::RECT2)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint64_t, Variant::INT, Rect2i, Variant::RECT2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint64_t, Variant::INT, Vector3, Variant::VECTOR3)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint64_t, Variant::INT, Vector3i, Variant::VECTOR3I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint64_t, Variant::INT, Transform2D, Variant::TRANSFORM2D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint64_t, Variant::INT, Plane, Variant::PLANE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint64_t, Variant::INT, Quaternion, Variant::QUATERNION)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint64_t, Variant::INT, AABB, Variant::AABB)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint64_t, Variant::INT, Basis, Variant::BASIS)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint64_t, Variant::INT, Transform3D, Variant::TRANSFORM3D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint64_t, Variant::INT, Color, Variant::COLOR)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint64_t, Variant::INT, StringName, Variant::STRING_NAME)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint64_t, Variant::INT, NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint64_t, Variant::INT, RID, Variant::RID)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint64_t, Variant::INT, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint64_t, Variant::INT, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint64_t, Variant::INT, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(uint64_t, Variant::INT, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int64_t, Variant::INT, float, Variant::FLOAT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int64_t, Variant::INT, double, Variant::FLOAT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int64_t, Variant::INT, String, Variant::STRING)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int64_t, Variant::INT, Vector2, Variant::VECTOR2)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int64_t, Variant::INT, Vector2i, Variant::VECTOR2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int64_t, Variant::INT, Rect2, Variant::RECT2)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int64_t, Variant::INT, Rect2i, Variant::RECT2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int64_t, Variant::INT, Vector3, Variant::VECTOR3)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int64_t, Variant::INT, Vector3i, Variant::VECTOR3I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int64_t, Variant::INT, Transform2D, Variant::TRANSFORM2D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int64_t, Variant::INT, Plane, Variant::PLANE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int64_t, Variant::INT, Quaternion, Variant::QUATERNION)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int64_t, Variant::INT, AABB, Variant::AABB)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int64_t, Variant::INT, Basis, Variant::BASIS)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int64_t, Variant::INT, Transform3D, Variant::TRANSFORM3D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int64_t, Variant::INT, Color, Variant::COLOR)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int64_t, Variant::INT, StringName, Variant::STRING_NAME)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int64_t, Variant::INT, NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int64_t, Variant::INT, RID, Variant::RID)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int64_t, Variant::INT, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int64_t, Variant::INT, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int64_t, Variant::INT, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(int64_t, Variant::INT, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(float, Variant::FLOAT, double, Variant::FLOAT)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(float, Variant::FLOAT, String, Variant::STRING)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(float, Variant::FLOAT, Vector2, Variant::VECTOR2)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(float, Variant::FLOAT, Vector2i, Variant::VECTOR2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(float, Variant::FLOAT, Rect2, Variant::RECT2)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(float, Variant::FLOAT, Rect2i, Variant::RECT2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(float, Variant::FLOAT, Vector3, Variant::VECTOR3)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(float, Variant::FLOAT, Vector3i, Variant::VECTOR3I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(float, Variant::FLOAT, Transform2D, Variant::TRANSFORM2D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(float, Variant::FLOAT, Plane, Variant::PLANE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(float, Variant::FLOAT, Quaternion, Variant::QUATERNION)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(float, Variant::FLOAT, AABB, Variant::AABB)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(float, Variant::FLOAT, Basis, Variant::BASIS)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(float, Variant::FLOAT, Transform3D, Variant::TRANSFORM3D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(float, Variant::FLOAT, Color, Variant::COLOR)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(float, Variant::FLOAT, StringName, Variant::STRING_NAME)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(float, Variant::FLOAT, NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(float, Variant::FLOAT, RID, Variant::RID)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(float, Variant::FLOAT, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(float, Variant::FLOAT, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(float, Variant::FLOAT, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(float, Variant::FLOAT, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(double, Variant::FLOAT, String, Variant::STRING)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(double, Variant::FLOAT, Vector2, Variant::VECTOR2)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(double, Variant::FLOAT, Vector2i, Variant::VECTOR2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(double, Variant::FLOAT, Rect2, Variant::RECT2)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(double, Variant::FLOAT, Rect2i, Variant::RECT2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(double, Variant::FLOAT, Vector3, Variant::VECTOR3)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(double, Variant::FLOAT, Vector3i, Variant::VECTOR3I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(double, Variant::FLOAT, Transform2D, Variant::TRANSFORM2D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(double, Variant::FLOAT, Plane, Variant::PLANE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(double, Variant::FLOAT, Quaternion, Variant::QUATERNION)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(double, Variant::FLOAT, AABB, Variant::AABB)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(double, Variant::FLOAT, Basis, Variant::BASIS)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(double, Variant::FLOAT, Transform3D, Variant::TRANSFORM3D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(double, Variant::FLOAT, Color, Variant::COLOR)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(double, Variant::FLOAT, StringName, Variant::STRING_NAME)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(double, Variant::FLOAT, NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(double, Variant::FLOAT, RID, Variant::RID)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(double, Variant::FLOAT, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(double, Variant::FLOAT, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(double, Variant::FLOAT, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(double, Variant::FLOAT, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(String, Variant::STRING, Vector2, Variant::VECTOR2)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(String, Variant::STRING, Vector2i, Variant::VECTOR2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(String, Variant::STRING, Rect2, Variant::RECT2)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(String, Variant::STRING, Rect2i, Variant::RECT2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(String, Variant::STRING, Vector3, Variant::VECTOR3)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(String, Variant::STRING, Vector3i, Variant::VECTOR3I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(String, Variant::STRING, Transform2D, Variant::TRANSFORM2D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(String, Variant::STRING, Plane, Variant::PLANE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(String, Variant::STRING, Quaternion, Variant::QUATERNION)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(String, Variant::STRING, AABB, Variant::AABB)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(String, Variant::STRING, Basis, Variant::BASIS)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(String, Variant::STRING, Transform3D, Variant::TRANSFORM3D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(String, Variant::STRING, Color, Variant::COLOR)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(String, Variant::STRING, StringName, Variant::STRING_NAME)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(String, Variant::STRING, NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(String, Variant::STRING, RID, Variant::RID)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(String, Variant::STRING, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(String, Variant::STRING, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(String, Variant::STRING, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(String, Variant::STRING, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2, Variant::VECTOR2, Vector2i, Variant::VECTOR2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2, Variant::VECTOR2, Rect2, Variant::RECT2)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2, Variant::VECTOR2, Rect2i, Variant::RECT2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2, Variant::VECTOR2, Vector3, Variant::VECTOR3)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2, Variant::VECTOR2, Vector3i, Variant::VECTOR3I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2, Variant::VECTOR2, Transform2D, Variant::TRANSFORM2D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2, Variant::VECTOR2, Plane, Variant::PLANE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2, Variant::VECTOR2, Quaternion, Variant::QUATERNION)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2, Variant::VECTOR2, AABB, Variant::AABB)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2, Variant::VECTOR2, Basis, Variant::BASIS)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2, Variant::VECTOR2, Transform3D, Variant::TRANSFORM3D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2, Variant::VECTOR2, Color, Variant::COLOR)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2, Variant::VECTOR2, StringName, Variant::STRING_NAME)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2, Variant::VECTOR2, NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2, Variant::VECTOR2, RID, Variant::RID)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2, Variant::VECTOR2, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2, Variant::VECTOR2, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2, Variant::VECTOR2, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2, Variant::VECTOR2, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2i, Variant::VECTOR2I, Rect2, Variant::RECT2)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2i, Variant::VECTOR2I, Rect2i, Variant::RECT2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2i, Variant::VECTOR2I, Vector3, Variant::VECTOR3)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2i, Variant::VECTOR2I, Vector3i, Variant::VECTOR3I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2i, Variant::VECTOR2I, Transform2D, Variant::TRANSFORM2D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2i, Variant::VECTOR2I, Plane, Variant::PLANE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2i, Variant::VECTOR2I, Quaternion, Variant::QUATERNION)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2i, Variant::VECTOR2I, AABB, Variant::AABB)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2i, Variant::VECTOR2I, Basis, Variant::BASIS)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2i, Variant::VECTOR2I, Transform3D, Variant::TRANSFORM3D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2i, Variant::VECTOR2I, Color, Variant::COLOR)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2i, Variant::VECTOR2I, StringName, Variant::STRING_NAME)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2i, Variant::VECTOR2I, NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2i, Variant::VECTOR2I, RID, Variant::RID)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2i, Variant::VECTOR2I, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2i, Variant::VECTOR2I, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2i, Variant::VECTOR2I, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector2i, Variant::VECTOR2I, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2, Variant::RECT2, Rect2i, Variant::RECT2I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2, Variant::RECT2, Vector3, Variant::VECTOR3)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2, Variant::RECT2, Vector3i, Variant::VECTOR3I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2, Variant::RECT2, Transform2D, Variant::TRANSFORM2D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2, Variant::RECT2, Plane, Variant::PLANE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2, Variant::RECT2, Quaternion, Variant::QUATERNION)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2, Variant::RECT2, AABB, Variant::AABB)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2, Variant::RECT2, Basis, Variant::BASIS)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2, Variant::RECT2, Transform3D, Variant::TRANSFORM3D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2, Variant::RECT2, Color, Variant::COLOR)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2, Variant::RECT2, StringName, Variant::STRING_NAME)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2, Variant::RECT2, NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2, Variant::RECT2, RID, Variant::RID)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2, Variant::RECT2, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2, Variant::RECT2, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2, Variant::RECT2, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2, Variant::RECT2, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2i, Variant::RECT2I, Vector3, Variant::VECTOR3)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2i, Variant::RECT2I, Vector3i, Variant::VECTOR3I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2i, Variant::RECT2I, Transform2D, Variant::TRANSFORM2D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2i, Variant::RECT2I, Plane, Variant::PLANE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2i, Variant::RECT2I, Quaternion, Variant::QUATERNION)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2i, Variant::RECT2I, AABB, Variant::AABB)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2i, Variant::RECT2I, Basis, Variant::BASIS)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2i, Variant::RECT2I, Transform3D, Variant::TRANSFORM3D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2i, Variant::RECT2I, Color, Variant::COLOR)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2i, Variant::RECT2I, StringName, Variant::STRING_NAME)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2i, Variant::RECT2I, NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2i, Variant::RECT2I, RID, Variant::RID)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2i, Variant::RECT2I, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2i, Variant::RECT2I, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2i, Variant::RECT2I, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Rect2i, Variant::RECT2I, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3, Variant::VECTOR3, Vector3i, Variant::VECTOR3I)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3, Variant::VECTOR3, Transform2D, Variant::TRANSFORM2D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3, Variant::VECTOR3, Plane, Variant::PLANE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3, Variant::VECTOR3, Quaternion, Variant::QUATERNION)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3, Variant::VECTOR3, AABB, Variant::AABB)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3, Variant::VECTOR3, Basis, Variant::BASIS)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3, Variant::VECTOR3, Transform3D, Variant::TRANSFORM3D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3, Variant::VECTOR3, Color, Variant::COLOR)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3, Variant::VECTOR3, StringName, Variant::STRING_NAME)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3, Variant::VECTOR3, NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3, Variant::VECTOR3, RID, Variant::RID)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3, Variant::VECTOR3, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3, Variant::VECTOR3, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3, Variant::VECTOR3, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3, Variant::VECTOR3, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3i, Variant::VECTOR3I, Transform2D, Variant::TRANSFORM2D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3i, Variant::VECTOR3I, Plane, Variant::PLANE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3i, Variant::VECTOR3I, Quaternion, Variant::QUATERNION)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3i, Variant::VECTOR3I, AABB, Variant::AABB)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3i, Variant::VECTOR3I, Basis, Variant::BASIS)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3i, Variant::VECTOR3I, Transform3D, Variant::TRANSFORM3D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3i, Variant::VECTOR3I, Color, Variant::COLOR)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3i, Variant::VECTOR3I, StringName, Variant::STRING_NAME)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3i, Variant::VECTOR3I, NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3i, Variant::VECTOR3I, RID, Variant::RID)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3i, Variant::VECTOR3I, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3i, Variant::VECTOR3I, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3i, Variant::VECTOR3I, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Vector3i, Variant::VECTOR3I, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Transform2D, Variant::TRANSFORM2D, Plane, Variant::PLANE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Transform2D, Variant::TRANSFORM2D, Quaternion, Variant::QUATERNION)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Transform2D, Variant::TRANSFORM2D, AABB, Variant::AABB)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Transform2D, Variant::TRANSFORM2D, Basis, Variant::BASIS)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Transform2D, Variant::TRANSFORM2D, Transform3D, Variant::TRANSFORM3D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Transform2D, Variant::TRANSFORM2D, Color, Variant::COLOR)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Transform2D, Variant::TRANSFORM2D, StringName, Variant::STRING_NAME)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Transform2D, Variant::TRANSFORM2D, NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Transform2D, Variant::TRANSFORM2D, RID, Variant::RID)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Transform2D, Variant::TRANSFORM2D, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Transform2D, Variant::TRANSFORM2D, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Transform2D, Variant::TRANSFORM2D, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Transform2D, Variant::TRANSFORM2D, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Plane, Variant::PLANE, Quaternion, Variant::QUATERNION)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Plane, Variant::PLANE, AABB, Variant::AABB)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Plane, Variant::PLANE, Basis, Variant::BASIS)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Plane, Variant::PLANE, Transform3D, Variant::TRANSFORM3D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Plane, Variant::PLANE, Color, Variant::COLOR)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Plane, Variant::PLANE, StringName, Variant::STRING_NAME)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Plane, Variant::PLANE, NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Plane, Variant::PLANE, RID, Variant::RID)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Plane, Variant::PLANE, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Plane, Variant::PLANE, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Plane, Variant::PLANE, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Plane, Variant::PLANE, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Quaternion, Variant::QUATERNION, AABB, Variant::AABB)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Quaternion, Variant::QUATERNION, Basis, Variant::BASIS)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Quaternion, Variant::QUATERNION, Transform3D, Variant::TRANSFORM3D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Quaternion, Variant::QUATERNION, Color, Variant::COLOR)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Quaternion, Variant::QUATERNION, StringName, Variant::STRING_NAME)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Quaternion, Variant::QUATERNION, NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Quaternion, Variant::QUATERNION, RID, Variant::RID)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Quaternion, Variant::QUATERNION, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Quaternion, Variant::QUATERNION, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Quaternion, Variant::QUATERNION, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Quaternion, Variant::QUATERNION, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(AABB, Variant::AABB, Basis, Variant::BASIS)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(AABB, Variant::AABB, Transform3D, Variant::TRANSFORM3D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(AABB, Variant::AABB, Color, Variant::COLOR)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(AABB, Variant::AABB, StringName, Variant::STRING_NAME)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(AABB, Variant::AABB, NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(AABB, Variant::AABB, RID, Variant::RID)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(AABB, Variant::AABB, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(AABB, Variant::AABB, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(AABB, Variant::AABB, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(AABB, Variant::AABB, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Basis, Variant::BASIS, Transform3D, Variant::TRANSFORM3D)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Basis, Variant::BASIS, Color, Variant::COLOR)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Basis, Variant::BASIS, StringName, Variant::STRING_NAME)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Basis, Variant::BASIS, NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Basis, Variant::BASIS, RID, Variant::RID)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Basis, Variant::BASIS, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Basis, Variant::BASIS, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Basis, Variant::BASIS, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Basis, Variant::BASIS, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Transform3D, Variant::TRANSFORM3D, Color, Variant::COLOR)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Transform3D, Variant::TRANSFORM3D, StringName, Variant::STRING_NAME)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Transform3D, Variant::TRANSFORM3D, NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Transform3D, Variant::TRANSFORM3D, RID, Variant::RID)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Transform3D, Variant::TRANSFORM3D, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Transform3D, Variant::TRANSFORM3D, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Transform3D, Variant::TRANSFORM3D, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Transform3D, Variant::TRANSFORM3D, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Color, Variant::COLOR, StringName, Variant::STRING_NAME)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Color, Variant::COLOR, NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Color, Variant::COLOR, RID, Variant::RID)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Color, Variant::COLOR, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Color, Variant::COLOR, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Color, Variant::COLOR, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Color, Variant::COLOR, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(StringName, Variant::STRING_NAME, NodePath, Variant::NODE_PATH)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(StringName, Variant::STRING_NAME, RID, Variant::RID)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(StringName, Variant::STRING_NAME, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(StringName, Variant::STRING_NAME, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(StringName, Variant::STRING_NAME, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(StringName, Variant::STRING_NAME, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(NodePath, Variant::NODE_PATH, RID, Variant::RID)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(NodePath, Variant::NODE_PATH, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(NodePath, Variant::NODE_PATH, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(NodePath, Variant::NODE_PATH, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(NodePath, Variant::NODE_PATH, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(RID, Variant::RID, Callable, Variant::CALLABLE)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(RID, Variant::RID, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(RID, Variant::RID, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(RID, Variant::RID, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Callable, Variant::CALLABLE, Signal, Variant::SIGNAL)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Callable, Variant::CALLABLE, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Callable, Variant::CALLABLE, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Signal, Variant::SIGNAL, Dictionary, Variant::DICTIONARY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Signal, Variant::SIGNAL, Array, Variant::ARRAY)
MAKE_TYPED_DICTIONARY_EXPANDED_INFO(Dictionary, Variant::DICTIONARY, Array, Variant::ARRAY)
#define CLASS_INFO(m_type) (GetTypeInfo<m_type *>::get_class_info()) #define CLASS_INFO(m_type) (GetTypeInfo<m_type *>::get_class_info())
} // namespace godot } // namespace godot

View File

@ -154,6 +154,7 @@ extern "C" GDExtensionInterfaceArrayRef gdextension_interface_array_ref;
extern "C" GDExtensionInterfaceArraySetTyped gdextension_interface_array_set_typed; extern "C" GDExtensionInterfaceArraySetTyped gdextension_interface_array_set_typed;
extern "C" GDExtensionInterfaceDictionaryOperatorIndex gdextension_interface_dictionary_operator_index; extern "C" GDExtensionInterfaceDictionaryOperatorIndex gdextension_interface_dictionary_operator_index;
extern "C" GDExtensionInterfaceDictionaryOperatorIndexConst gdextension_interface_dictionary_operator_index_const; extern "C" GDExtensionInterfaceDictionaryOperatorIndexConst gdextension_interface_dictionary_operator_index_const;
extern "C" GDExtensionInterfaceDictionarySetTyped gdextension_interface_dictionary_set_typed;
extern "C" GDExtensionInterfaceObjectMethodBindCall gdextension_interface_object_method_bind_call; extern "C" GDExtensionInterfaceObjectMethodBindCall gdextension_interface_object_method_bind_call;
extern "C" GDExtensionInterfaceObjectMethodBindPtrcall gdextension_interface_object_method_bind_ptrcall; extern "C" GDExtensionInterfaceObjectMethodBindPtrcall gdextension_interface_object_method_bind_ptrcall;
extern "C" GDExtensionInterfaceObjectDestroy gdextension_interface_object_destroy; extern "C" GDExtensionInterfaceObjectDestroy gdextension_interface_object_destroy;

View File

@ -52,6 +52,8 @@ class VMap;
template <class T> template <class T>
class CharStringT; class CharStringT;
SAFE_NUMERIC_TYPE_PUN_GUARANTEES(uint64_t)
// Silence a false positive warning (see GH-52119). // Silence a false positive warning (see GH-52119).
#if defined(__GNUC__) && !defined(__clang__) #if defined(__GNUC__) && !defined(__clang__)
#pragma GCC diagnostic push #pragma GCC diagnostic push
@ -69,52 +71,71 @@ class CowData {
template <class TS> template <class TS>
friend class CharStringT; friend class CharStringT;
public:
typedef int64_t Size;
typedef uint64_t USize;
static constexpr USize MAX_INT = INT64_MAX;
private: private:
// Function to find the next power of 2 to an integer.
static _FORCE_INLINE_ USize next_po2(USize x) {
if (x == 0) {
return 0;
}
--x;
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
if (sizeof(USize) == 8) {
x |= x >> 32;
}
return ++x;
}
static constexpr USize ALLOC_PAD = sizeof(USize) * 2; // For size and atomic refcount.
mutable T *_ptr = nullptr; mutable T *_ptr = nullptr;
// internal helpers // internal helpers
_FORCE_INLINE_ SafeNumeric<uint32_t> *_get_refcount() const { _FORCE_INLINE_ SafeNumeric<USize> *_get_refcount() const {
if (!_ptr) { if (!_ptr) {
return nullptr; return nullptr;
} }
return reinterpret_cast<SafeNumeric<uint32_t> *>(_ptr) - 2; return reinterpret_cast<SafeNumeric<USize> *>(_ptr) - 2;
} }
_FORCE_INLINE_ uint32_t *_get_size() const { _FORCE_INLINE_ USize *_get_size() const {
if (!_ptr) { if (!_ptr) {
return nullptr; return nullptr;
} }
return reinterpret_cast<uint32_t *>(_ptr) - 1; return reinterpret_cast<USize *>(_ptr) - 1;
} }
_FORCE_INLINE_ T *_get_data() const { _FORCE_INLINE_ USize _get_alloc_size(USize p_elements) const {
if (!_ptr) { return next_po2(p_elements * sizeof(T));
return nullptr;
}
return reinterpret_cast<T *>(_ptr);
} }
_FORCE_INLINE_ size_t _get_alloc_size(size_t p_elements) const { _FORCE_INLINE_ bool _get_alloc_size_checked(USize p_elements, USize *out) const {
return next_power_of_2(p_elements * sizeof(T));
}
_FORCE_INLINE_ bool _get_alloc_size_checked(size_t p_elements, size_t *out) const {
if (unlikely(p_elements == 0)) { if (unlikely(p_elements == 0)) {
*out = 0; *out = 0;
return true; return true;
} }
#if defined(__GNUC__) #if defined(__GNUC__) && defined(IS_32_BIT)
size_t o; USize o;
size_t p; USize p;
if (__builtin_mul_overflow(p_elements, sizeof(T), &o)) { if (__builtin_mul_overflow(p_elements, sizeof(T), &o)) {
*out = 0; *out = 0;
return false; return false;
} }
*out = next_power_of_2(o); *out = next_po2(o);
if (__builtin_add_overflow(o, static_cast<size_t>(32), &p)) { if (__builtin_add_overflow(o, static_cast<USize>(32), &p)) {
return false; // No longer allocated here. return false; // No longer allocated here.
} }
#else #else
@ -128,22 +149,22 @@ private:
void _unref(void *p_data); void _unref(void *p_data);
void _ref(const CowData *p_from); void _ref(const CowData *p_from);
void _ref(const CowData &p_from); void _ref(const CowData &p_from);
uint32_t _copy_on_write(); USize _copy_on_write();
public: public:
void operator=(const CowData<T> &p_from) { _ref(p_from); } void operator=(const CowData<T> &p_from) { _ref(p_from); }
_FORCE_INLINE_ T *ptrw() { _FORCE_INLINE_ T *ptrw() {
_copy_on_write(); _copy_on_write();
return (T *)_get_data(); return _ptr;
} }
_FORCE_INLINE_ const T *ptr() const { _FORCE_INLINE_ const T *ptr() const {
return _get_data(); return _ptr;
} }
_FORCE_INLINE_ int size() const { _FORCE_INLINE_ Size size() const {
uint32_t *size = (uint32_t *)_get_size(); USize *size = (USize *)_get_size();
if (size) { if (size) {
return *size; return *size;
} else { } else {
@ -154,41 +175,42 @@ public:
_FORCE_INLINE_ void clear() { resize(0); } _FORCE_INLINE_ void clear() { resize(0); }
_FORCE_INLINE_ bool is_empty() const { return _ptr == nullptr; } _FORCE_INLINE_ bool is_empty() const { return _ptr == nullptr; }
_FORCE_INLINE_ void set(int p_index, const T &p_elem) { _FORCE_INLINE_ void set(Size p_index, const T &p_elem) {
ERR_FAIL_INDEX(p_index, size()); ERR_FAIL_INDEX(p_index, size());
_copy_on_write(); _copy_on_write();
_get_data()[p_index] = p_elem; _ptr[p_index] = p_elem;
} }
_FORCE_INLINE_ T &get_m(int p_index) { _FORCE_INLINE_ T &get_m(Size p_index) {
CRASH_BAD_INDEX(p_index, size()); CRASH_BAD_INDEX(p_index, size());
_copy_on_write(); _copy_on_write();
return _get_data()[p_index]; return _ptr[p_index];
} }
_FORCE_INLINE_ const T &get(int p_index) const { _FORCE_INLINE_ const T &get(Size p_index) const {
CRASH_BAD_INDEX(p_index, size()); CRASH_BAD_INDEX(p_index, size());
return _get_data()[p_index]; return _ptr[p_index];
} }
Error resize(int p_size); template <bool p_ensure_zero = false>
Error resize(Size p_size);
_FORCE_INLINE_ void remove_at(int p_index) { _FORCE_INLINE_ void remove_at(Size p_index) {
ERR_FAIL_INDEX(p_index, size()); ERR_FAIL_INDEX(p_index, size());
T *p = ptrw(); T *p = ptrw();
int len = size(); Size len = size();
for (int i = p_index; i < len - 1; i++) { for (Size i = p_index; i < len - 1; i++) {
p[i] = p[i + 1]; p[i] = p[i + 1];
} }
resize(len - 1); resize(len - 1);
} }
Error insert(int p_pos, const T &p_val) { Error insert(Size p_pos, const T &p_val) {
ERR_FAIL_INDEX_V(p_pos, size() + 1, ERR_INVALID_PARAMETER); ERR_FAIL_INDEX_V(p_pos, size() + 1, ERR_INVALID_PARAMETER);
resize(size() + 1); resize(size() + 1);
for (int i = (size() - 1); i > p_pos; i--) { for (Size i = (size() - 1); i > p_pos; i--) {
set(i, get(i - 1)); set(i, get(i - 1));
} }
set(p_pos, p_val); set(p_pos, p_val);
@ -196,11 +218,13 @@ public:
return OK; return OK;
} }
int find(const T &p_val, int p_from = 0) const; Size find(const T &p_val, Size p_from = 0) const;
Size rfind(const T &p_val, Size p_from = -1) const;
Size count(const T &p_val) const;
_FORCE_INLINE_ CowData() {} _FORCE_INLINE_ CowData() {}
_FORCE_INLINE_ ~CowData(); _FORCE_INLINE_ ~CowData();
_FORCE_INLINE_ CowData(CowData<T> &p_from) { _ref(p_from); } _FORCE_INLINE_ CowData(CowData<T> &p_from) { _ref(p_from); };
}; };
template <class T> template <class T>
@ -209,44 +233,45 @@ void CowData<T>::_unref(void *p_data) {
return; return;
} }
SafeNumeric<uint32_t> *refc = _get_refcount(); SafeNumeric<USize> *refc = _get_refcount();
if (refc->decrement() > 0) { if (refc->decrement() > 0) {
return; // still in use return; // still in use
} }
// clean up // clean up
if (!std::is_trivially_destructible<T>::value) { if (!std::is_trivially_destructible<T>::value) {
uint32_t *count = _get_size(); USize *count = _get_size();
T *data = (T *)(count + 1); T *data = (T *)(count + 1);
for (uint32_t i = 0; i < *count; ++i) { for (USize i = 0; i < *count; ++i) {
// call destructors // call destructors
data[i].~T(); data[i].~T();
} }
} }
// free mem // free mem
Memory::free_static((uint8_t *)p_data, true); Memory::free_static(((uint8_t *)p_data) - ALLOC_PAD, false);
} }
template <class T> template <class T>
uint32_t CowData<T>::_copy_on_write() { typename CowData<T>::USize CowData<T>::_copy_on_write() {
if (!_ptr) { if (!_ptr) {
return 0; return 0;
} }
SafeNumeric<uint32_t> *refc = _get_refcount(); SafeNumeric<USize> *refc = _get_refcount();
uint32_t rc = refc->get(); USize rc = refc->get();
if (unlikely(rc > 1)) { if (unlikely(rc > 1)) {
/* in use by more than me */ /* in use by more than me */
uint32_t current_size = *_get_size(); USize current_size = *_get_size();
uint32_t *mem_new = (uint32_t *)Memory::alloc_static(_get_alloc_size(current_size), true); USize *mem_new = (USize *)Memory::alloc_static(_get_alloc_size(current_size) + ALLOC_PAD, false);
mem_new += 2;
new (mem_new - 2) SafeNumeric<uint32_t>(1); // refcount new (mem_new - 2) SafeNumeric<USize>(1); //refcount
*(mem_new - 1) = current_size; // size *(mem_new - 1) = current_size; //size
T *_data = (T *)(mem_new); T *_data = (T *)(mem_new);
@ -255,8 +280,8 @@ uint32_t CowData<T>::_copy_on_write() {
memcpy(mem_new, _ptr, current_size * sizeof(T)); memcpy(mem_new, _ptr, current_size * sizeof(T));
} else { } else {
for (uint32_t i = 0; i < current_size; i++) { for (USize i = 0; i < current_size; i++) {
memnew_placement(&_data[i], T(_get_data()[i])); memnew_placement(&_data[i], T(_ptr[i]));
} }
} }
@ -269,10 +294,11 @@ uint32_t CowData<T>::_copy_on_write() {
} }
template <class T> template <class T>
Error CowData<T>::resize(int p_size) { template <bool p_ensure_zero>
Error CowData<T>::resize(Size p_size) {
ERR_FAIL_COND_V(p_size < 0, ERR_INVALID_PARAMETER); ERR_FAIL_COND_V(p_size < 0, ERR_INVALID_PARAMETER);
int current_size = size(); Size current_size = size();
if (p_size == current_size) { if (p_size == current_size) {
return OK; return OK;
@ -286,27 +312,29 @@ Error CowData<T>::resize(int p_size) {
} }
// possibly changing size, copy on write // possibly changing size, copy on write
uint32_t rc = _copy_on_write(); USize rc = _copy_on_write();
size_t current_alloc_size = _get_alloc_size(current_size); USize current_alloc_size = _get_alloc_size(current_size);
size_t alloc_size; USize alloc_size;
ERR_FAIL_COND_V(!_get_alloc_size_checked(p_size, &alloc_size), ERR_OUT_OF_MEMORY); ERR_FAIL_COND_V(!_get_alloc_size_checked(p_size, &alloc_size), ERR_OUT_OF_MEMORY);
if (p_size > current_size) { if (p_size > current_size) {
if (alloc_size != current_alloc_size) { if (alloc_size != current_alloc_size) {
if (current_size == 0) { if (current_size == 0) {
// alloc from scratch // alloc from scratch
uint32_t *ptr = (uint32_t *)Memory::alloc_static(alloc_size, true); USize *ptr = (USize *)Memory::alloc_static(alloc_size + ALLOC_PAD, false);
ptr += 2;
ERR_FAIL_NULL_V(ptr, ERR_OUT_OF_MEMORY); ERR_FAIL_NULL_V(ptr, ERR_OUT_OF_MEMORY);
*(ptr - 1) = 0; // size, currently none *(ptr - 1) = 0; //size, currently none
new (ptr - 2) SafeNumeric<uint32_t>(1); // refcount new (ptr - 2) SafeNumeric<USize>(1); //refcount
_ptr = (T *)ptr; _ptr = (T *)ptr;
} else { } else {
uint32_t *_ptrnew = (uint32_t *)Memory::realloc_static(_ptr, alloc_size, true); USize *_ptrnew = (USize *)Memory::realloc_static(((uint8_t *)_ptr) - ALLOC_PAD, alloc_size + ALLOC_PAD, false);
ERR_FAIL_NULL_V(_ptrnew, ERR_OUT_OF_MEMORY); ERR_FAIL_NULL_V(_ptrnew, ERR_OUT_OF_MEMORY);
new (_ptrnew - 2) SafeNumeric<uint32_t>(rc); // refcount _ptrnew += 2;
new (_ptrnew - 2) SafeNumeric<USize>(rc); //refcount
_ptr = (T *)(_ptrnew); _ptr = (T *)(_ptrnew);
} }
@ -315,11 +343,11 @@ Error CowData<T>::resize(int p_size) {
// construct the newly created elements // construct the newly created elements
if (!std::is_trivially_constructible<T>::value) { if (!std::is_trivially_constructible<T>::value) {
T *elems = _get_data(); for (Size i = *_get_size(); i < p_size; i++) {
memnew_placement(&_ptr[i], T);
for (int i = *_get_size(); i < p_size; i++) {
memnew_placement(&elems[i], T);
} }
} else if (p_ensure_zero) {
memset((void *)(_ptr + current_size), 0, (p_size - current_size) * sizeof(T));
} }
*_get_size() = p_size; *_get_size() = p_size;
@ -327,16 +355,17 @@ Error CowData<T>::resize(int p_size) {
} else if (p_size < current_size) { } else if (p_size < current_size) {
if (!std::is_trivially_destructible<T>::value) { if (!std::is_trivially_destructible<T>::value) {
// deinitialize no longer needed elements // deinitialize no longer needed elements
for (uint32_t i = p_size; i < *_get_size(); i++) { for (USize i = p_size; i < *_get_size(); i++) {
T *t = &_get_data()[i]; T *t = &_ptr[i];
t->~T(); t->~T();
} }
} }
if (alloc_size != current_alloc_size) { if (alloc_size != current_alloc_size) {
uint32_t *_ptrnew = (uint32_t *)Memory::realloc_static(_ptr, alloc_size, true); USize *_ptrnew = (USize *)Memory::realloc_static(((uint8_t *)_ptr) - ALLOC_PAD, alloc_size + ALLOC_PAD, false);
ERR_FAIL_NULL_V(_ptrnew, ERR_OUT_OF_MEMORY); ERR_FAIL_NULL_V(_ptrnew, ERR_OUT_OF_MEMORY);
new (_ptrnew - 2) SafeNumeric<uint32_t>(rc); // refcount _ptrnew += 2;
new (_ptrnew - 2) SafeNumeric<USize>(rc); //refcount
_ptr = (T *)(_ptrnew); _ptr = (T *)(_ptrnew);
} }
@ -348,14 +377,14 @@ Error CowData<T>::resize(int p_size) {
} }
template <class T> template <class T>
int CowData<T>::find(const T &p_val, int p_from) const { typename CowData<T>::Size CowData<T>::find(const T &p_val, Size p_from) const {
int ret = -1; Size ret = -1;
if (p_from < 0 || size() == 0) { if (p_from < 0 || size() == 0) {
return ret; return ret;
} }
for (int i = p_from; i < size(); i++) { for (Size i = p_from; i < size(); i++) {
if (get(i) == p_val) { if (get(i) == p_val) {
ret = i; ret = i;
break; break;
@ -365,6 +394,36 @@ int CowData<T>::find(const T &p_val, int p_from) const {
return ret; return ret;
} }
template <class T>
typename CowData<T>::Size CowData<T>::rfind(const T &p_val, Size p_from) const {
const Size s = size();
if (p_from < 0) {
p_from = s + p_from;
}
if (p_from < 0 || p_from >= s) {
p_from = s - 1;
}
for (Size i = p_from; i >= 0; i--) {
if (get(i) == p_val) {
return i;
}
}
return -1;
}
template <class T>
typename CowData<T>::Size CowData<T>::count(const T &p_val) const {
Size amount = 0;
for (Size i = 0; i < size(); i++) {
if (get(i) == p_val) {
amount++;
}
}
return amount;
}
template <class T> template <class T>
void CowData<T>::_ref(const CowData *p_from) { void CowData<T>::_ref(const CowData *p_from) {
_ref(*p_from); _ref(*p_from);

View File

@ -48,6 +48,15 @@ namespace godot {
// value and, as an important benefit, you can be sure the value is properly synchronized // value and, as an important benefit, you can be sure the value is properly synchronized
// even with threads that are already running. // even with threads that are already running.
// These are used in very specific areas of the engine where it's critical that these guarantees are held
#define SAFE_NUMERIC_TYPE_PUN_GUARANTEES(m_type) \
static_assert(sizeof(SafeNumeric<m_type>) == sizeof(m_type)); \
static_assert(alignof(SafeNumeric<m_type>) == alignof(m_type)); \
static_assert(std::is_trivially_destructible<std::atomic<m_type>>::value);
#define SAFE_FLAG_TYPE_PUN_GUARANTEES \
static_assert(sizeof(SafeFlag) == sizeof(bool)); \
static_assert(alignof(SafeFlag) == alignof(bool));
template <class T> template <class T>
class SafeNumeric { class SafeNumeric {
std::atomic<T> value; std::atomic<T> value;

View File

@ -50,7 +50,7 @@ namespace godot {
template <class T> template <class T>
class VectorWriteProxy { class VectorWriteProxy {
public: public:
_FORCE_INLINE_ T &operator[](int p_index) { _FORCE_INLINE_ T &operator[](typename CowData<T>::Size p_index) {
CRASH_BAD_INDEX(p_index, ((Vector<T> *)(this))->_cowdata.size()); CRASH_BAD_INDEX(p_index, ((Vector<T> *)(this))->_cowdata.size());
return ((Vector<T> *)(this))->_cowdata.ptrw()[p_index]; return ((Vector<T> *)(this))->_cowdata.ptrw()[p_index];
@ -63,22 +63,26 @@ class Vector {
public: public:
VectorWriteProxy<T> write; VectorWriteProxy<T> write;
typedef typename CowData<T>::Size Size;
private: private:
CowData<T> _cowdata; CowData<T> _cowdata;
public: public:
bool push_back(T p_elem); bool push_back(T p_elem);
_FORCE_INLINE_ bool append(const T &p_elem) { return push_back(p_elem); } // alias _FORCE_INLINE_ bool append(const T &p_elem) { return push_back(p_elem); } //alias
void fill(T p_elem); void fill(T p_elem);
void remove_at(int p_index) { _cowdata.remove_at(p_index); } void remove_at(Size p_index) { _cowdata.remove_at(p_index); }
void erase(const T &p_val) { _FORCE_INLINE_ bool erase(const T &p_val) {
int idx = find(p_val); Size idx = find(p_val);
if (idx >= 0) { if (idx >= 0) {
remove_at(idx); remove_at(idx);
return true;
} }
return false;
} }
void reverse(); void reverse();
_FORCE_INLINE_ T *ptrw() { return _cowdata.ptrw(); } _FORCE_INLINE_ T *ptrw() { return _cowdata.ptrw(); }
@ -86,37 +90,45 @@ public:
_FORCE_INLINE_ void clear() { resize(0); } _FORCE_INLINE_ void clear() { resize(0); }
_FORCE_INLINE_ bool is_empty() const { return _cowdata.is_empty(); } _FORCE_INLINE_ bool is_empty() const { return _cowdata.is_empty(); }
_FORCE_INLINE_ T get(int p_index) { return _cowdata.get(p_index); } _FORCE_INLINE_ T get(Size p_index) { return _cowdata.get(p_index); }
_FORCE_INLINE_ const T &get(int p_index) const { return _cowdata.get(p_index); } _FORCE_INLINE_ const T &get(Size p_index) const { return _cowdata.get(p_index); }
_FORCE_INLINE_ void set(int p_index, const T &p_elem) { _cowdata.set(p_index, p_elem); } _FORCE_INLINE_ void set(Size p_index, const T &p_elem) { _cowdata.set(p_index, p_elem); }
_FORCE_INLINE_ int size() const { return _cowdata.size(); } _FORCE_INLINE_ Size size() const { return _cowdata.size(); }
Error resize(int p_size) { return _cowdata.resize(p_size); } Error resize(Size p_size) { return _cowdata.resize(p_size); }
_FORCE_INLINE_ const T &operator[](int p_index) const { return _cowdata.get(p_index); } Error resize_zeroed(Size p_size) { return _cowdata.template resize<true>(p_size); }
Error insert(int p_pos, T p_val) { return _cowdata.insert(p_pos, p_val); } _FORCE_INLINE_ const T &operator[](Size p_index) const { return _cowdata.get(p_index); }
int find(const T &p_val, int p_from = 0) const { return _cowdata.find(p_val, p_from); } Error insert(Size p_pos, T p_val) { return _cowdata.insert(p_pos, p_val); }
Size find(const T &p_val, Size p_from = 0) const { return _cowdata.find(p_val, p_from); }
Size rfind(const T &p_val, Size p_from = -1) const { return _cowdata.rfind(p_val, p_from); }
Size count(const T &p_val) const { return _cowdata.count(p_val); }
void append_array(Vector<T> p_other); void append_array(Vector<T> p_other);
_FORCE_INLINE_ bool has(const T &p_val) const { return find(p_val) != -1; } _FORCE_INLINE_ bool has(const T &p_val) const { return find(p_val) != -1; }
template <class C> void sort() {
void sort_custom() { sort_custom<_DefaultComparator<T>>();
int len = _cowdata.size(); }
template <class Comparator, bool Validate = SORT_ARRAY_VALIDATE_ENABLED, class... Args>
void sort_custom(Args &&...args) {
Size len = _cowdata.size();
if (len == 0) { if (len == 0) {
return; return;
} }
T *data = ptrw(); T *data = ptrw();
SortArray<T, C> sorter; SortArray<T, Comparator, Validate> sorter{ args... };
sorter.sort(data, len); sorter.sort(data, len);
} }
void sort() { Size bsearch(const T &p_value, bool p_before) {
sort_custom<_DefaultComparator<T>>(); return bsearch_custom<_DefaultComparator<T>>(p_value, p_before);
} }
int bsearch(const T &p_value, bool p_before) { template <class Comparator, class Value, class... Args>
SearchArray<T> search; Size bsearch_custom(const Value &p_value, bool p_before, Args &&...args) {
SearchArray<T, Comparator> search{ args... };
return search.bisect(ptrw(), size(), p_value, p_before); return search.bisect(ptrw(), size(), p_value, p_before);
} }
@ -125,7 +137,7 @@ public:
} }
void ordered_insert(const T &p_val) { void ordered_insert(const T &p_val) {
int i; Size i;
for (i = 0; i < _cowdata.size(); i++) { for (i = 0; i < _cowdata.size(); i++) {
if (p_val < operator[](i)) { if (p_val < operator[](i)) {
break; break;
@ -140,33 +152,36 @@ public:
Vector<uint8_t> to_byte_array() const { Vector<uint8_t> to_byte_array() const {
Vector<uint8_t> ret; Vector<uint8_t> ret;
if (is_empty()) {
return ret;
}
ret.resize(size() * sizeof(T)); ret.resize(size() * sizeof(T));
memcpy(ret.ptrw(), ptr(), sizeof(T) * size()); memcpy(ret.ptrw(), ptr(), sizeof(T) * size());
return ret; return ret;
} }
Vector<T> slice(int p_begin, int p_end = INT_MAX) const { Vector<T> slice(Size p_begin, Size p_end = CowData<T>::MAX_INT) const {
Vector<T> result; Vector<T> result;
const int s = size(); const Size s = size();
int begin = Math::clamp(p_begin, -s, s); Size begin = CLAMP(p_begin, -s, s);
if (begin < 0) { if (begin < 0) {
begin += s; begin += s;
} }
int end = Math::clamp(p_end, -s, s); Size end = CLAMP(p_end, -s, s);
if (end < 0) { if (end < 0) {
end += s; end += s;
} }
ERR_FAIL_COND_V(begin > end, result); ERR_FAIL_COND_V(begin > end, result);
int result_size = end - begin; Size result_size = end - begin;
result.resize(result_size); result.resize(result_size);
const T *const r = ptr(); const T *const r = ptr();
T *const w = result.ptrw(); T *const w = result.ptrw();
for (int i = 0; i < result_size; ++i) { for (Size i = 0; i < result_size; ++i) {
w[i] = r[begin + i]; w[i] = r[begin + i];
} }
@ -174,11 +189,11 @@ public:
} }
bool operator==(const Vector<T> &p_arr) const { bool operator==(const Vector<T> &p_arr) const {
int s = size(); Size s = size();
if (s != p_arr.size()) { if (s != p_arr.size()) {
return false; return false;
} }
for (int i = 0; i < s; i++) { for (Size i = 0; i < s; i++) {
if (operator[](i) != p_arr[i]) { if (operator[](i) != p_arr[i]) {
return false; return false;
} }
@ -187,11 +202,11 @@ public:
} }
bool operator!=(const Vector<T> &p_arr) const { bool operator!=(const Vector<T> &p_arr) const {
int s = size(); Size s = size();
if (s != p_arr.size()) { if (s != p_arr.size()) {
return true; return true;
} }
for (int i = 0; i < s; i++) { for (Size i = 0; i < s; i++) {
if (operator[](i) != p_arr[i]) { if (operator[](i) != p_arr[i]) {
return true; return true;
} }
@ -268,7 +283,7 @@ public:
Error err = _cowdata.resize(p_init.size()); Error err = _cowdata.resize(p_init.size());
ERR_FAIL_COND(err); ERR_FAIL_COND(err);
int i = 0; Size i = 0;
for (const T &element : p_init) { for (const T &element : p_init) {
_cowdata.set(i++, element); _cowdata.set(i++, element);
} }
@ -280,7 +295,7 @@ public:
template <class T> template <class T>
void Vector<T>::reverse() { void Vector<T>::reverse() {
for (int i = 0; i < size() / 2; i++) { for (Size i = 0; i < size() / 2; i++) {
T *p = ptrw(); T *p = ptrw();
SWAP(p[i], p[size() - i - 1]); SWAP(p[i], p[size() - i - 1]);
} }
@ -288,13 +303,13 @@ void Vector<T>::reverse() {
template <class T> template <class T>
void Vector<T>::append_array(Vector<T> p_other) { void Vector<T>::append_array(Vector<T> p_other) {
const int ds = p_other.size(); const Size ds = p_other.size();
if (ds == 0) { if (ds == 0) {
return; return;
} }
const int bs = size(); const Size bs = size();
resize(bs + ds); resize(bs + ds);
for (int i = 0; i < ds; ++i) { for (Size i = 0; i < ds; ++i) {
ptrw()[bs + i] = p_other[i]; ptrw()[bs + i] = p_other[i];
} }
} }
@ -311,7 +326,7 @@ bool Vector<T>::push_back(T p_elem) {
template <class T> template <class T>
void Vector<T>::fill(T p_elem) { void Vector<T>::fill(T p_elem) {
T *p = ptrw(); T *p = ptrw();
for (int i = 0; i < size(); i++) { for (Size i = 0; i < size(); i++) {
p[i] = p_elem; p[i] = p_elem;
} }
} }

View File

@ -201,11 +201,11 @@ inline bool AABB::encloses(const AABB &p_aabb) const {
return ( return (
(src_min.x <= dst_min.x) && (src_min.x <= dst_min.x) &&
(src_max.x > dst_max.x) && (src_max.x >= dst_max.x) &&
(src_min.y <= dst_min.y) && (src_min.y <= dst_min.y) &&
(src_max.y > dst_max.y) && (src_max.y >= dst_max.y) &&
(src_min.z <= dst_min.z) && (src_min.z <= dst_min.z) &&
(src_max.z > dst_max.z)); (src_max.z >= dst_max.z));
} }
Vector3 AABB::get_support(const Vector3 &p_normal) const { Vector3 AABB::get_support(const Vector3 &p_normal) const {

View File

@ -46,11 +46,11 @@ class CharProxy {
template <class TS> template <class TS>
friend class CharStringT; friend class CharStringT;
const int _index; const int64_t _index;
CowData<T> &_cowdata; CowData<T> &_cowdata;
static inline const T _null = 0; static inline const T _null = 0;
_FORCE_INLINE_ CharProxy(const int &p_index, CowData<T> &p_cowdata) : _FORCE_INLINE_ CharProxy(const int64_t &p_index, CowData<T> &p_cowdata) :
_index(p_index), _index(p_index),
_cowdata(p_cowdata) {} _cowdata(p_cowdata) {}
@ -90,19 +90,19 @@ class CharStringT {
public: public:
_FORCE_INLINE_ T *ptrw() { return _cowdata.ptrw(); } _FORCE_INLINE_ T *ptrw() { return _cowdata.ptrw(); }
_FORCE_INLINE_ const T *ptr() const { return _cowdata.ptr(); } _FORCE_INLINE_ const T *ptr() const { return _cowdata.ptr(); }
_FORCE_INLINE_ int size() const { return _cowdata.size(); } _FORCE_INLINE_ int64_t size() const { return _cowdata.size(); }
Error resize(int p_size) { return _cowdata.resize(p_size); } Error resize(int64_t p_size) { return _cowdata.resize(p_size); }
_FORCE_INLINE_ T get(int p_index) const { return _cowdata.get(p_index); } _FORCE_INLINE_ T get(int64_t p_index) const { return _cowdata.get(p_index); }
_FORCE_INLINE_ void set(int p_index, const T &p_elem) { _cowdata.set(p_index, p_elem); } _FORCE_INLINE_ void set(int64_t p_index, const T &p_elem) { _cowdata.set(p_index, p_elem); }
_FORCE_INLINE_ const T &operator[](int p_index) const { _FORCE_INLINE_ const T &operator[](int64_t p_index) const {
if (unlikely(p_index == _cowdata.size())) { if (unlikely(p_index == _cowdata.size())) {
return _null; return _null;
} }
return _cowdata.get(p_index); return _cowdata.get(p_index);
} }
_FORCE_INLINE_ CharProxy<T> operator[](int p_index) { return CharProxy<T>(p_index, _cowdata); } _FORCE_INLINE_ CharProxy<T> operator[](int64_t p_index) { return CharProxy<T>(p_index, _cowdata); }
_FORCE_INLINE_ CharStringT() {} _FORCE_INLINE_ CharStringT() {}
_FORCE_INLINE_ CharStringT(const CharStringT<T> &p_str) { _cowdata._ref(p_str._cowdata); } _FORCE_INLINE_ CharStringT(const CharStringT<T> &p_str) { _cowdata._ref(p_str._cowdata); }
@ -112,7 +112,7 @@ public:
void operator=(const T *p_cstr); void operator=(const T *p_cstr);
bool operator<(const CharStringT<T> &p_right) const; bool operator<(const CharStringT<T> &p_right) const;
CharStringT<T> &operator+=(T p_char); CharStringT<T> &operator+=(T p_char);
int length() const { return size() ? size() - 1 : 0; } int64_t length() const { return size() ? size() - 1 : 0; }
const T *get_data() const; const T *get_data() const;
operator const T *() const { return get_data(); }; operator const T *() const { return get_data(); };

File diff suppressed because it is too large Load Diff

View File

@ -122,6 +122,7 @@ public:
OP_NEGATE, OP_NEGATE,
OP_POSITIVE, OP_POSITIVE,
OP_MODULE, OP_MODULE,
OP_POWER,
// bitwise // bitwise
OP_SHIFT_LEFT, OP_SHIFT_LEFT,
OP_SHIFT_RIGHT, OP_SHIFT_RIGHT,

View File

@ -160,6 +160,7 @@ GDExtensionInterfaceArrayRef gdextension_interface_array_ref = nullptr;
GDExtensionInterfaceArraySetTyped gdextension_interface_array_set_typed = nullptr; GDExtensionInterfaceArraySetTyped gdextension_interface_array_set_typed = nullptr;
GDExtensionInterfaceDictionaryOperatorIndex gdextension_interface_dictionary_operator_index = nullptr; GDExtensionInterfaceDictionaryOperatorIndex gdextension_interface_dictionary_operator_index = nullptr;
GDExtensionInterfaceDictionaryOperatorIndexConst gdextension_interface_dictionary_operator_index_const = nullptr; GDExtensionInterfaceDictionaryOperatorIndexConst gdextension_interface_dictionary_operator_index_const = nullptr;
GDExtensionInterfaceDictionarySetTyped gdextension_interface_dictionary_set_typed = nullptr;
GDExtensionInterfaceObjectMethodBindCall gdextension_interface_object_method_bind_call = nullptr; GDExtensionInterfaceObjectMethodBindCall gdextension_interface_object_method_bind_call = nullptr;
GDExtensionInterfaceObjectMethodBindPtrcall gdextension_interface_object_method_bind_ptrcall = nullptr; GDExtensionInterfaceObjectMethodBindPtrcall gdextension_interface_object_method_bind_ptrcall = nullptr;
GDExtensionInterfaceObjectDestroy gdextension_interface_object_destroy = nullptr; GDExtensionInterfaceObjectDestroy gdextension_interface_object_destroy = nullptr;
@ -397,6 +398,7 @@ GDExtensionBool GDExtensionBinding::init(GDExtensionInterfaceGetProcAddress p_ge
LOAD_PROC_ADDRESS(array_set_typed, GDExtensionInterfaceArraySetTyped); LOAD_PROC_ADDRESS(array_set_typed, GDExtensionInterfaceArraySetTyped);
LOAD_PROC_ADDRESS(dictionary_operator_index, GDExtensionInterfaceDictionaryOperatorIndex); LOAD_PROC_ADDRESS(dictionary_operator_index, GDExtensionInterfaceDictionaryOperatorIndex);
LOAD_PROC_ADDRESS(dictionary_operator_index_const, GDExtensionInterfaceDictionaryOperatorIndexConst); LOAD_PROC_ADDRESS(dictionary_operator_index_const, GDExtensionInterfaceDictionaryOperatorIndexConst);
LOAD_PROC_ADDRESS(dictionary_set_typed, GDExtensionInterfaceDictionarySetTyped);
LOAD_PROC_ADDRESS(object_method_bind_call, GDExtensionInterfaceObjectMethodBindCall); LOAD_PROC_ADDRESS(object_method_bind_call, GDExtensionInterfaceObjectMethodBindCall);
LOAD_PROC_ADDRESS(object_method_bind_ptrcall, GDExtensionInterfaceObjectMethodBindPtrcall); LOAD_PROC_ADDRESS(object_method_bind_ptrcall, GDExtensionInterfaceObjectMethodBindPtrcall);
LOAD_PROC_ADDRESS(object_destroy, GDExtensionInterfaceObjectDestroy); LOAD_PROC_ADDRESS(object_destroy, GDExtensionInterfaceObjectDestroy);

View File

@ -76,7 +76,7 @@ bool CharStringT<T>::operator<(const CharStringT<T> &p_right) const {
template <class T> template <class T>
CharStringT<T> &CharStringT<T>::operator+=(T p_char) { CharStringT<T> &CharStringT<T>::operator+=(T p_char) {
const int lhs_len = length(); const int64_t lhs_len = length();
resize(lhs_len + 2); resize(lhs_len + 2);
T *dst = ptrw(); T *dst = ptrw();
@ -172,23 +172,23 @@ String::String(const char32_t *from) {
internal::gdextension_interface_string_new_with_utf32_chars(_native_ptr(), from); internal::gdextension_interface_string_new_with_utf32_chars(_native_ptr(), from);
} }
String String::utf8(const char *from, int len) { String String::utf8(const char *from, int64_t len) {
String ret; String ret;
ret.parse_utf8(from, len); ret.parse_utf8(from, len);
return ret; return ret;
} }
void String::parse_utf8(const char *from, int len) { void String::parse_utf8(const char *from, int64_t len) {
internal::gdextension_interface_string_new_with_utf8_chars_and_len(_native_ptr(), from, len); internal::gdextension_interface_string_new_with_utf8_chars_and_len(_native_ptr(), from, len);
} }
String String::utf16(const char16_t *from, int len) { String String::utf16(const char16_t *from, int64_t len) {
String ret; String ret;
ret.parse_utf16(from, len); ret.parse_utf16(from, len);
return ret; return ret;
} }
void String::parse_utf16(const char16_t *from, int len) { void String::parse_utf16(const char16_t *from, int64_t len) {
internal::gdextension_interface_string_new_with_utf16_chars_and_len(_native_ptr(), from, len); internal::gdextension_interface_string_new_with_utf16_chars_and_len(_native_ptr(), from, len);
} }
@ -230,8 +230,8 @@ String rtoss(double p_val) {
} }
CharString String::utf8() const { CharString String::utf8() const {
int length = internal::gdextension_interface_string_to_utf8_chars(_native_ptr(), nullptr, 0); int64_t length = internal::gdextension_interface_string_to_utf8_chars(_native_ptr(), nullptr, 0);
int size = length + 1; int64_t size = length + 1;
CharString str; CharString str;
str.resize(size); str.resize(size);
internal::gdextension_interface_string_to_utf8_chars(_native_ptr(), str.ptrw(), length); internal::gdextension_interface_string_to_utf8_chars(_native_ptr(), str.ptrw(), length);
@ -242,8 +242,8 @@ CharString String::utf8() const {
} }
CharString String::ascii() const { CharString String::ascii() const {
int length = internal::gdextension_interface_string_to_latin1_chars(_native_ptr(), nullptr, 0); int64_t length = internal::gdextension_interface_string_to_latin1_chars(_native_ptr(), nullptr, 0);
int size = length + 1; int64_t size = length + 1;
CharString str; CharString str;
str.resize(size); str.resize(size);
internal::gdextension_interface_string_to_latin1_chars(_native_ptr(), str.ptrw(), length); internal::gdextension_interface_string_to_latin1_chars(_native_ptr(), str.ptrw(), length);
@ -254,8 +254,8 @@ CharString String::ascii() const {
} }
Char16String String::utf16() const { Char16String String::utf16() const {
int length = internal::gdextension_interface_string_to_utf16_chars(_native_ptr(), nullptr, 0); int64_t length = internal::gdextension_interface_string_to_utf16_chars(_native_ptr(), nullptr, 0);
int size = length + 1; int64_t size = length + 1;
Char16String str; Char16String str;
str.resize(size); str.resize(size);
internal::gdextension_interface_string_to_utf16_chars(_native_ptr(), str.ptrw(), length); internal::gdextension_interface_string_to_utf16_chars(_native_ptr(), str.ptrw(), length);
@ -266,8 +266,8 @@ Char16String String::utf16() const {
} }
Char32String String::utf32() const { Char32String String::utf32() const {
int length = internal::gdextension_interface_string_to_utf32_chars(_native_ptr(), nullptr, 0); int64_t length = internal::gdextension_interface_string_to_utf32_chars(_native_ptr(), nullptr, 0);
int size = length + 1; int64_t size = length + 1;
Char32String str; Char32String str;
str.resize(size); str.resize(size);
internal::gdextension_interface_string_to_utf32_chars(_native_ptr(), str.ptrw(), length); internal::gdextension_interface_string_to_utf32_chars(_native_ptr(), str.ptrw(), length);
@ -278,8 +278,8 @@ Char32String String::utf32() const {
} }
CharWideString String::wide_string() const { CharWideString String::wide_string() const {
int length = internal::gdextension_interface_string_to_wide_chars(_native_ptr(), nullptr, 0); int64_t length = internal::gdextension_interface_string_to_wide_chars(_native_ptr(), nullptr, 0);
int size = length + 1; int64_t size = length + 1;
CharWideString str; CharWideString str;
str.resize(size); str.resize(size);
internal::gdextension_interface_string_to_wide_chars(_native_ptr(), str.ptrw(), length); internal::gdextension_interface_string_to_wide_chars(_native_ptr(), str.ptrw(), length);
@ -289,7 +289,7 @@ CharWideString String::wide_string() const {
return str; return str;
} }
Error String::resize(int p_size) { Error String::resize(int64_t p_size) {
return (Error)internal::gdextension_interface_string_resize(_native_ptr(), p_size); return (Error)internal::gdextension_interface_string_resize(_native_ptr(), p_size);
} }
@ -390,11 +390,11 @@ String &String::operator+=(const char32_t *p_str) {
return *this; return *this;
} }
const char32_t &String::operator[](int p_index) const { const char32_t &String::operator[](int64_t p_index) const {
return *internal::gdextension_interface_string_operator_index_const((GDExtensionStringPtr)this, p_index); return *internal::gdextension_interface_string_operator_index_const((GDExtensionStringPtr)this, p_index);
} }
char32_t &String::operator[](int p_index) { char32_t &String::operator[](int64_t p_index) {
return *internal::gdextension_interface_string_operator_index((GDExtensionStringPtr)this, p_index); return *internal::gdextension_interface_string_operator_index((GDExtensionStringPtr)this, p_index);
} }

View File

@ -46,11 +46,11 @@
namespace godot { namespace godot {
const uint8_t &PackedByteArray::operator[](int p_index) const { const uint8_t &PackedByteArray::operator[](int64_t p_index) const {
return *internal::gdextension_interface_packed_byte_array_operator_index_const((GDExtensionTypePtr *)this, p_index); return *internal::gdextension_interface_packed_byte_array_operator_index_const((GDExtensionTypePtr *)this, p_index);
} }
uint8_t &PackedByteArray::operator[](int p_index) { uint8_t &PackedByteArray::operator[](int64_t p_index) {
return *internal::gdextension_interface_packed_byte_array_operator_index((GDExtensionTypePtr *)this, p_index); return *internal::gdextension_interface_packed_byte_array_operator_index((GDExtensionTypePtr *)this, p_index);
} }
@ -62,12 +62,12 @@ uint8_t *PackedByteArray::ptrw() {
return internal::gdextension_interface_packed_byte_array_operator_index((GDExtensionTypePtr *)this, 0); return internal::gdextension_interface_packed_byte_array_operator_index((GDExtensionTypePtr *)this, 0);
} }
const Color &PackedColorArray::operator[](int p_index) const { const Color &PackedColorArray::operator[](int64_t p_index) const {
const Color *color = (const Color *)internal::gdextension_interface_packed_color_array_operator_index_const((GDExtensionTypePtr *)this, p_index); const Color *color = (const Color *)internal::gdextension_interface_packed_color_array_operator_index_const((GDExtensionTypePtr *)this, p_index);
return *color; return *color;
} }
Color &PackedColorArray::operator[](int p_index) { Color &PackedColorArray::operator[](int64_t p_index) {
Color *color = (Color *)internal::gdextension_interface_packed_color_array_operator_index((GDExtensionTypePtr *)this, p_index); Color *color = (Color *)internal::gdextension_interface_packed_color_array_operator_index((GDExtensionTypePtr *)this, p_index);
return *color; return *color;
} }
@ -80,11 +80,11 @@ Color *PackedColorArray::ptrw() {
return (Color *)internal::gdextension_interface_packed_color_array_operator_index((GDExtensionTypePtr *)this, 0); return (Color *)internal::gdextension_interface_packed_color_array_operator_index((GDExtensionTypePtr *)this, 0);
} }
const float &PackedFloat32Array::operator[](int p_index) const { const float &PackedFloat32Array::operator[](int64_t p_index) const {
return *internal::gdextension_interface_packed_float32_array_operator_index_const((GDExtensionTypePtr *)this, p_index); return *internal::gdextension_interface_packed_float32_array_operator_index_const((GDExtensionTypePtr *)this, p_index);
} }
float &PackedFloat32Array::operator[](int p_index) { float &PackedFloat32Array::operator[](int64_t p_index) {
return *internal::gdextension_interface_packed_float32_array_operator_index((GDExtensionTypePtr *)this, p_index); return *internal::gdextension_interface_packed_float32_array_operator_index((GDExtensionTypePtr *)this, p_index);
} }
@ -96,11 +96,11 @@ float *PackedFloat32Array::ptrw() {
return internal::gdextension_interface_packed_float32_array_operator_index((GDExtensionTypePtr *)this, 0); return internal::gdextension_interface_packed_float32_array_operator_index((GDExtensionTypePtr *)this, 0);
} }
const double &PackedFloat64Array::operator[](int p_index) const { const double &PackedFloat64Array::operator[](int64_t p_index) const {
return *internal::gdextension_interface_packed_float64_array_operator_index_const((GDExtensionTypePtr *)this, p_index); return *internal::gdextension_interface_packed_float64_array_operator_index_const((GDExtensionTypePtr *)this, p_index);
} }
double &PackedFloat64Array::operator[](int p_index) { double &PackedFloat64Array::operator[](int64_t p_index) {
return *internal::gdextension_interface_packed_float64_array_operator_index((GDExtensionTypePtr *)this, p_index); return *internal::gdextension_interface_packed_float64_array_operator_index((GDExtensionTypePtr *)this, p_index);
} }
@ -112,11 +112,11 @@ double *PackedFloat64Array::ptrw() {
return internal::gdextension_interface_packed_float64_array_operator_index((GDExtensionTypePtr *)this, 0); return internal::gdextension_interface_packed_float64_array_operator_index((GDExtensionTypePtr *)this, 0);
} }
const int32_t &PackedInt32Array::operator[](int p_index) const { const int32_t &PackedInt32Array::operator[](int64_t p_index) const {
return *internal::gdextension_interface_packed_int32_array_operator_index_const((GDExtensionTypePtr *)this, p_index); return *internal::gdextension_interface_packed_int32_array_operator_index_const((GDExtensionTypePtr *)this, p_index);
} }
int32_t &PackedInt32Array::operator[](int p_index) { int32_t &PackedInt32Array::operator[](int64_t p_index) {
return *internal::gdextension_interface_packed_int32_array_operator_index((GDExtensionTypePtr *)this, p_index); return *internal::gdextension_interface_packed_int32_array_operator_index((GDExtensionTypePtr *)this, p_index);
} }
@ -128,11 +128,11 @@ int32_t *PackedInt32Array::ptrw() {
return internal::gdextension_interface_packed_int32_array_operator_index((GDExtensionTypePtr *)this, 0); return internal::gdextension_interface_packed_int32_array_operator_index((GDExtensionTypePtr *)this, 0);
} }
const int64_t &PackedInt64Array::operator[](int p_index) const { const int64_t &PackedInt64Array::operator[](int64_t p_index) const {
return *internal::gdextension_interface_packed_int64_array_operator_index_const((GDExtensionTypePtr *)this, p_index); return *internal::gdextension_interface_packed_int64_array_operator_index_const((GDExtensionTypePtr *)this, p_index);
} }
int64_t &PackedInt64Array::operator[](int p_index) { int64_t &PackedInt64Array::operator[](int64_t p_index) {
return *internal::gdextension_interface_packed_int64_array_operator_index((GDExtensionTypePtr *)this, p_index); return *internal::gdextension_interface_packed_int64_array_operator_index((GDExtensionTypePtr *)this, p_index);
} }
@ -144,12 +144,12 @@ int64_t *PackedInt64Array::ptrw() {
return internal::gdextension_interface_packed_int64_array_operator_index((GDExtensionTypePtr *)this, 0); return internal::gdextension_interface_packed_int64_array_operator_index((GDExtensionTypePtr *)this, 0);
} }
const String &PackedStringArray::operator[](int p_index) const { const String &PackedStringArray::operator[](int64_t p_index) const {
const String *string = (const String *)internal::gdextension_interface_packed_string_array_operator_index_const((GDExtensionTypePtr *)this, p_index); const String *string = (const String *)internal::gdextension_interface_packed_string_array_operator_index_const((GDExtensionTypePtr *)this, p_index);
return *string; return *string;
} }
String &PackedStringArray::operator[](int p_index) { String &PackedStringArray::operator[](int64_t p_index) {
String *string = (String *)internal::gdextension_interface_packed_string_array_operator_index((GDExtensionTypePtr *)this, p_index); String *string = (String *)internal::gdextension_interface_packed_string_array_operator_index((GDExtensionTypePtr *)this, p_index);
return *string; return *string;
} }
@ -162,12 +162,12 @@ String *PackedStringArray::ptrw() {
return (String *)internal::gdextension_interface_packed_string_array_operator_index((GDExtensionTypePtr *)this, 0); return (String *)internal::gdextension_interface_packed_string_array_operator_index((GDExtensionTypePtr *)this, 0);
} }
const Vector2 &PackedVector2Array::operator[](int p_index) const { const Vector2 &PackedVector2Array::operator[](int64_t p_index) const {
const Vector2 *vec = (const Vector2 *)internal::gdextension_interface_packed_vector2_array_operator_index_const((GDExtensionTypePtr *)this, p_index); const Vector2 *vec = (const Vector2 *)internal::gdextension_interface_packed_vector2_array_operator_index_const((GDExtensionTypePtr *)this, p_index);
return *vec; return *vec;
} }
Vector2 &PackedVector2Array::operator[](int p_index) { Vector2 &PackedVector2Array::operator[](int64_t p_index) {
Vector2 *vec = (Vector2 *)internal::gdextension_interface_packed_vector2_array_operator_index((GDExtensionTypePtr *)this, p_index); Vector2 *vec = (Vector2 *)internal::gdextension_interface_packed_vector2_array_operator_index((GDExtensionTypePtr *)this, p_index);
return *vec; return *vec;
} }
@ -180,12 +180,12 @@ Vector2 *PackedVector2Array::ptrw() {
return (Vector2 *)internal::gdextension_interface_packed_vector2_array_operator_index((GDExtensionTypePtr *)this, 0); return (Vector2 *)internal::gdextension_interface_packed_vector2_array_operator_index((GDExtensionTypePtr *)this, 0);
} }
const Vector3 &PackedVector3Array::operator[](int p_index) const { const Vector3 &PackedVector3Array::operator[](int64_t p_index) const {
const Vector3 *vec = (const Vector3 *)internal::gdextension_interface_packed_vector3_array_operator_index_const((GDExtensionTypePtr *)this, p_index); const Vector3 *vec = (const Vector3 *)internal::gdextension_interface_packed_vector3_array_operator_index_const((GDExtensionTypePtr *)this, p_index);
return *vec; return *vec;
} }
Vector3 &PackedVector3Array::operator[](int p_index) { Vector3 &PackedVector3Array::operator[](int64_t p_index) {
Vector3 *vec = (Vector3 *)internal::gdextension_interface_packed_vector3_array_operator_index((GDExtensionTypePtr *)this, p_index); Vector3 *vec = (Vector3 *)internal::gdextension_interface_packed_vector3_array_operator_index((GDExtensionTypePtr *)this, p_index);
return *vec; return *vec;
} }
@ -198,12 +198,12 @@ Vector3 *PackedVector3Array::ptrw() {
return (Vector3 *)internal::gdextension_interface_packed_vector3_array_operator_index((GDExtensionTypePtr *)this, 0); return (Vector3 *)internal::gdextension_interface_packed_vector3_array_operator_index((GDExtensionTypePtr *)this, 0);
} }
const Variant &Array::operator[](int p_index) const { const Variant &Array::operator[](int64_t p_index) const {
const Variant *var = (const Variant *)internal::gdextension_interface_array_operator_index_const((GDExtensionTypePtr *)this, p_index); const Variant *var = (const Variant *)internal::gdextension_interface_array_operator_index_const((GDExtensionTypePtr *)this, p_index);
return *var; return *var;
} }
Variant &Array::operator[](int p_index) { Variant &Array::operator[](int64_t p_index) {
Variant *var = (Variant *)internal::gdextension_interface_array_operator_index((GDExtensionTypePtr *)this, p_index); Variant *var = (Variant *)internal::gdextension_interface_array_operator_index((GDExtensionTypePtr *)this, p_index);
return *var; return *var;
} }
@ -227,4 +227,10 @@ Variant &Dictionary::operator[](const Variant &p_key) {
return *var; return *var;
} }
void Dictionary::set_typed(uint32_t p_key_type, const StringName &p_key_class_name, const Variant &p_key_script, uint32_t p_value_type, const StringName &p_value_class_name, const Variant &p_value_script) {
// p_key_type/p_value_type are not Variant::Type so that header doesn't depend on <variant.hpp>.
internal::gdextension_interface_dictionary_set_typed((GDExtensionTypePtr *)this, (GDExtensionVariantType)p_key_type, (GDExtensionConstStringNamePtr)&p_key_class_name, (GDExtensionConstVariantPtr)&p_key_script,
(GDExtensionVariantType)p_value_type, (GDExtensionConstStringNamePtr)&p_value_class_name, (GDExtensionConstVariantPtr)&p_value_script);
}
} // namespace godot } // namespace godot

View File

@ -78,10 +78,13 @@ func _ready():
# Array and Dictionary # Array and Dictionary
assert_equal(example.test_array(), [1, 2]) assert_equal(example.test_array(), [1, 2])
assert_equal(example.test_tarray(), [ Vector2(1, 2), Vector2(2, 3) ]) assert_equal(example.test_tarray(), [Vector2(1, 2), Vector2(2, 3)])
assert_equal(example.test_dictionary(), {"hello": "world", "foo": "bar"})
var array: Array[int] = [1, 2, 3] var array: Array[int] = [1, 2, 3]
assert_equal(example.test_tarray_arg(array), 6) assert_equal(example.test_tarray_arg(array), 6)
assert_equal(example.test_dictionary(), { "hello": "world", "foo": "bar" })
assert_equal(example.test_tdictionary(), { Vector2(1, 2): Vector2i(2, 3) })
var dictionary: Dictionary[String, int] = { "1": 1, "2": 2, "3": 3 }
assert_equal(example.test_tdictionary_arg(dictionary), 6)
example.callable_bind() example.callable_bind()
assert_equal(custom_signal_emitted, ["bound", 11]) assert_equal(custom_signal_emitted, ["bound", 11])

View File

@ -191,6 +191,8 @@ void Example::_bind_methods() {
ClassDB::bind_method(D_METHOD("test_tarray_arg", "array"), &Example::test_tarray_arg); ClassDB::bind_method(D_METHOD("test_tarray_arg", "array"), &Example::test_tarray_arg);
ClassDB::bind_method(D_METHOD("test_tarray"), &Example::test_tarray); ClassDB::bind_method(D_METHOD("test_tarray"), &Example::test_tarray);
ClassDB::bind_method(D_METHOD("test_dictionary"), &Example::test_dictionary); ClassDB::bind_method(D_METHOD("test_dictionary"), &Example::test_dictionary);
ClassDB::bind_method(D_METHOD("test_tdictionary_arg", "dictionary"), &Example::test_tdictionary_arg);
ClassDB::bind_method(D_METHOD("test_tdictionary"), &Example::test_tdictionary);
ClassDB::bind_method(D_METHOD("test_node_argument"), &Example::test_node_argument); ClassDB::bind_method(D_METHOD("test_node_argument"), &Example::test_node_argument);
ClassDB::bind_method(D_METHOD("test_string_ops"), &Example::test_string_ops); ClassDB::bind_method(D_METHOD("test_string_ops"), &Example::test_string_ops);
ClassDB::bind_method(D_METHOD("test_str_utility"), &Example::test_str_utility); ClassDB::bind_method(D_METHOD("test_str_utility"), &Example::test_str_utility);
@ -497,6 +499,23 @@ Dictionary Example::test_dictionary() const {
return dict; return dict;
} }
int Example::test_tdictionary_arg(const TypedDictionary<String, int64_t> &p_dictionary) {
int sum = 0;
TypedArray<int64_t> values = p_dictionary.values();
for (int i = 0; i < p_dictionary.size(); i++) {
sum += (int)values[i];
}
return sum;
}
TypedDictionary<Vector2, Vector2i> Example::test_tdictionary() const {
TypedDictionary<Vector2, Vector2i> dict;
dict[Vector2(1, 2)] = Vector2i(2, 3);
return dict;
}
Example *Example::test_node_argument(Example *p_node) const { Example *Example::test_node_argument(Example *p_node) const {
return p_node; return p_node;
} }

View File

@ -123,6 +123,8 @@ public:
int test_tarray_arg(const TypedArray<int64_t> &p_array); int test_tarray_arg(const TypedArray<int64_t> &p_array);
TypedArray<Vector2> test_tarray() const; TypedArray<Vector2> test_tarray() const;
Dictionary test_dictionary() const; Dictionary test_dictionary() const;
int test_tdictionary_arg(const TypedDictionary<String, int64_t> &p_dictionary);
TypedDictionary<Vector2, Vector2i> test_tdictionary() const;
Example *test_node_argument(Example *p_node) const; Example *test_node_argument(Example *p_node) const;
String test_string_ops() const; String test_string_ops() const;
String test_str_utility() const; String test_str_utility() const;
@ -198,11 +200,22 @@ protected:
static void _bind_methods() {} static void _bind_methods() {}
}; };
class ExampleAbstract : public Object { class ExampleAbstractBase : public Object {
GDCLASS(ExampleAbstract, Object); GDCLASS(ExampleAbstractBase, Object);
protected: protected:
static void _bind_methods() {} static void _bind_methods() {}
virtual int test_function() = 0;
};
class ExampleConcrete : public ExampleAbstractBase {
GDCLASS(ExampleConcrete, ExampleAbstractBase);
protected:
static void _bind_methods() {}
virtual int test_function() override { return 25; }
}; };
#endif // EXAMPLE_CLASS_H #endif // EXAMPLE_CLASS_H

View File

@ -25,7 +25,8 @@ void initialize_example_module(ModuleInitializationLevel p_level) {
ClassDB::register_class<ExampleMin>(); ClassDB::register_class<ExampleMin>();
ClassDB::register_class<Example>(); ClassDB::register_class<Example>();
ClassDB::register_class<ExampleVirtual>(true); ClassDB::register_class<ExampleVirtual>(true);
ClassDB::register_abstract_class<ExampleAbstract>(); ClassDB::register_abstract_class<ExampleAbstractBase>();
ClassDB::register_class<ExampleConcrete>();
} }
void uninitialize_example_module(ModuleInitializationLevel p_level) { void uninitialize_example_module(ModuleInitializationLevel p_level) {