diff --git a/include/godot_cpp/core/binder_common.hpp b/include/godot_cpp/core/binder_common.hpp index ba99aa38a..aed6b1534 100644 --- a/include/godot_cpp/core/binder_common.hpp +++ b/include/godot_cpp/core/binder_common.hpp @@ -37,7 +37,6 @@ #include #include -#include namespace godot { @@ -331,7 +330,7 @@ void call_with_variant_args_retc(T *p_instance, R (T::*p_method)(P...) const, co } template -void call_with_variant_args_dv(T *p_instance, void (T::*p_method)(P...), const GDExtensionConstVariantPtr *p_args, int p_argcount, GDExtensionCallError &r_error, const std::vector &default_values) { +void call_with_variant_args_dv(T *p_instance, void (T::*p_method)(P...), const GDExtensionConstVariantPtr *p_args, int p_argcount, GDExtensionCallError &r_error, const LocalVector &default_values) { #ifdef DEBUG_ENABLED if ((size_t)p_argcount > sizeof...(P)) { r_error.error = GDEXTENSION_CALL_ERROR_TOO_MANY_ARGUMENTS; @@ -366,7 +365,7 @@ void call_with_variant_args_dv(T *p_instance, void (T::*p_method)(P...), const G } template -void call_with_variant_argsc_dv(T *p_instance, void (T::*p_method)(P...) const, const GDExtensionConstVariantPtr *p_args, int p_argcount, GDExtensionCallError &r_error, const std::vector &default_values) { +void call_with_variant_argsc_dv(T *p_instance, void (T::*p_method)(P...) const, const GDExtensionConstVariantPtr *p_args, int p_argcount, GDExtensionCallError &r_error, const LocalVector &default_values) { #ifdef DEBUG_ENABLED if ((size_t)p_argcount > sizeof...(P)) { r_error.error = GDEXTENSION_CALL_ERROR_TOO_MANY_ARGUMENTS; @@ -401,7 +400,7 @@ void call_with_variant_argsc_dv(T *p_instance, void (T::*p_method)(P...) const, } template -void call_with_variant_args_ret_dv(T *p_instance, R (T::*p_method)(P...), const GDExtensionConstVariantPtr *p_args, int p_argcount, Variant &r_ret, GDExtensionCallError &r_error, const std::vector &default_values) { +void call_with_variant_args_ret_dv(T *p_instance, R (T::*p_method)(P...), const GDExtensionConstVariantPtr *p_args, int p_argcount, Variant &r_ret, GDExtensionCallError &r_error, const LocalVector &default_values) { #ifdef DEBUG_ENABLED if ((size_t)p_argcount > sizeof...(P)) { r_error.error = GDEXTENSION_CALL_ERROR_TOO_MANY_ARGUMENTS; @@ -436,7 +435,7 @@ void call_with_variant_args_ret_dv(T *p_instance, R (T::*p_method)(P...), const } template -void call_with_variant_args_retc_dv(T *p_instance, R (T::*p_method)(P...) const, const GDExtensionConstVariantPtr *p_args, int p_argcount, Variant &r_ret, GDExtensionCallError &r_error, const std::vector &default_values) { +void call_with_variant_args_retc_dv(T *p_instance, R (T::*p_method)(P...) const, const GDExtensionConstVariantPtr *p_args, int p_argcount, Variant &r_ret, GDExtensionCallError &r_error, const LocalVector &default_values) { #ifdef DEBUG_ENABLED if ((size_t)p_argcount > sizeof...(P)) { r_error.error = GDEXTENSION_CALL_ERROR_TOO_MANY_ARGUMENTS; @@ -548,7 +547,7 @@ void call_with_variant_args_static(void (*p_method)(P...), const Variant **p_arg } template -void call_with_variant_args_static_dv(void (*p_method)(P...), const GDExtensionConstVariantPtr *p_args, int p_argcount, GDExtensionCallError &r_error, const std::vector &default_values) { +void call_with_variant_args_static_dv(void (*p_method)(P...), const GDExtensionConstVariantPtr *p_args, int p_argcount, GDExtensionCallError &r_error, const LocalVector &default_values) { #ifdef DEBUG_ENABLED if ((size_t)p_argcount > sizeof...(P)) { r_error.error = GDEXTENSION_CALL_ERROR_TOO_MANY_ARGUMENTS; @@ -640,7 +639,7 @@ void call_with_variant_args_static_ret(R (*p_method)(P...), const Variant **p_ar } template -void call_with_variant_args_static_ret_dv(R (*p_method)(P...), const GDExtensionConstVariantPtr *p_args, int p_argcount, Variant &r_ret, GDExtensionCallError &r_error, const std::vector &default_values) { +void call_with_variant_args_static_ret_dv(R (*p_method)(P...), const GDExtensionConstVariantPtr *p_args, int p_argcount, Variant &r_ret, GDExtensionCallError &r_error, const LocalVector &default_values) { #ifdef DEBUG_ENABLED if ((size_t)p_argcount > sizeof...(P)) { r_error.error = GDEXTENSION_CALL_ERROR_TOO_MANY_ARGUMENTS; diff --git a/include/godot_cpp/core/class_db.hpp b/include/godot_cpp/core/class_db.hpp index 24ac5bfb4..311109217 100644 --- a/include/godot_cpp/core/class_db.hpp +++ b/include/godot_cpp/core/class_db.hpp @@ -44,11 +44,12 @@ // Needs to come after method_bind and object have been included. #include +#include + #include #include #include #include -#include // Needed to use StringName as key in `std::unordered_map` template <> @@ -108,7 +109,7 @@ class ClassDB { static std::unordered_map classes; static std::unordered_map instance_binding_callbacks; // Used to remember the custom class registration order. - static std::vector class_register_order; + static LocalVector class_register_order; static std::unordered_map engine_singletons; static std::mutex engine_singletons_mutex; @@ -190,7 +191,7 @@ class ClassDB { static MethodBind *bind_static_method(StringName p_class, N p_method_name, M p_method, VarArgs... p_args); template - static MethodBind *bind_vararg_method(uint32_t p_flags, StringName p_name, M p_method, const MethodInfo &p_info = MethodInfo(), const std::vector &p_default_args = std::vector{}, bool p_return_nil_is_variant = true); + static MethodBind *bind_vararg_method(uint32_t p_flags, StringName p_name, M p_method, const MethodInfo &p_info = MethodInfo(), const LocalVector &p_default_args = LocalVector{}, bool p_return_nil_is_variant = true); static void add_property_group(const StringName &p_class, const String &p_name, const String &p_prefix); static void add_property_subgroup(const StringName &p_class, const String &p_name, const String &p_prefix); @@ -330,7 +331,7 @@ MethodBind *ClassDB::bind_static_method(StringName p_class, N p_method_name, M p } template -MethodBind *ClassDB::bind_vararg_method(uint32_t p_flags, StringName p_name, M p_method, const MethodInfo &p_info, const std::vector &p_default_args, bool p_return_nil_is_variant) { +MethodBind *ClassDB::bind_vararg_method(uint32_t p_flags, StringName p_name, M p_method, const MethodInfo &p_info, const LocalVector &p_default_args, bool p_return_nil_is_variant) { MethodBind *bind = create_vararg_method_bind(p_method, p_info, p_return_nil_is_variant); ERR_FAIL_NULL_V(bind, nullptr); diff --git a/include/godot_cpp/core/method_bind.hpp b/include/godot_cpp/core/method_bind.hpp index aa5c8c493..59fb85d44 100644 --- a/include/godot_cpp/core/method_bind.hpp +++ b/include/godot_cpp/core/method_bind.hpp @@ -38,8 +38,7 @@ #include #include - -#include +#include namespace godot { @@ -54,9 +53,9 @@ class MethodBind { bool _returns = false; bool _vararg = false; - std::vector argument_names; + LocalVector argument_names; GDExtensionVariantType *argument_types = nullptr; - std::vector default_arguments; + LocalVector default_arguments; protected: void _set_const(bool p_const); @@ -70,7 +69,7 @@ class MethodBind { void set_argument_count(int p_count) { argument_count = p_count; } public: - _FORCE_INLINE_ const std::vector &get_default_arguments() const { return default_arguments; } + _FORCE_INLINE_ const LocalVector &get_default_arguments() const { return default_arguments; } _FORCE_INLINE_ int get_default_argument_count() const { return (int)default_arguments.size(); } _FORCE_INLINE_ Variant has_default_argument(int p_arg) const { @@ -101,8 +100,8 @@ class MethodBind { PropertyInfo get_argument_info(int p_argument) const; - std::vector get_arguments_info_list() const { - std::vector vec; + LocalVector get_arguments_info_list() const { + LocalVector vec; // First element is return value vec.reserve(argument_count + 1); for (int i = 0; i < argument_count + 1; i++) { @@ -111,8 +110,8 @@ class MethodBind { return vec; } - void set_argument_names(const std::vector &p_names); - std::vector get_argument_names() const; + void set_argument_names(const LocalVector &p_names); + LocalVector get_argument_names() const; virtual GDExtensionClassMethodArgumentMetadata get_argument_metadata(int p_argument) const = 0; @@ -133,10 +132,10 @@ class MethodBind { _FORCE_INLINE_ bool is_vararg() const { return _vararg; } _FORCE_INLINE_ bool has_return() const { return _returns; } - void set_default_arguments(const std::vector &p_default_arguments) { default_arguments = p_default_arguments; } + void set_default_arguments(const LocalVector &p_default_arguments) { default_arguments = p_default_arguments; } - std::vector get_arguments_metadata_list() const { - std::vector vec; + LocalVector get_arguments_metadata_list() const { + LocalVector vec; // First element is return value vec.reserve(argument_count + 1); for (int i = 0; i < argument_count + 1; i++) { @@ -155,7 +154,7 @@ template class MethodBindVarArgBase : public MethodBind { protected: R (T::*method)(const Variant **, GDExtensionInt, GDExtensionCallError &); - std::vector arguments; + LocalVector arguments; public: virtual PropertyInfo gen_argument_type_info(int p_arg) const { @@ -191,7 +190,7 @@ class MethodBindVarArgBase : public MethodBind { if (p_method_info.arguments.size()) { arguments = p_method_info.arguments; - std::vector names; + LocalVector names; names.reserve(p_method_info.arguments.size()); for (size_t i = 0; i < p_method_info.arguments.size(); i++) { names.push_back(p_method_info.arguments[i].name); diff --git a/include/godot_cpp/core/object.hpp b/include/godot_cpp/core/object.hpp index 9eab6e5c0..f3e028d43 100644 --- a/include/godot_cpp/core/object.hpp +++ b/include/godot_cpp/core/object.hpp @@ -38,14 +38,14 @@ #include +#include + #include #include #include -#include - #define ADD_SIGNAL(m_signal) ::godot::ClassDB::add_signal(get_class_static(), m_signal) #define ADD_GROUP(m_name, m_prefix) ::godot::ClassDB::add_property_group(get_class_static(), m_name, m_prefix) #define ADD_SUBGROUP(m_name, m_prefix) ::godot::ClassDB::add_property_subgroup(get_class_static(), m_name, m_prefix) @@ -65,10 +65,10 @@ struct MethodInfo { PropertyInfo return_val; uint32_t flags; int id = 0; - std::vector arguments; - std::vector default_arguments; + LocalVector arguments; + LocalVector default_arguments; GDExtensionClassMethodArgumentMetadata return_val_metadata; - std::vector arguments_metadata; + LocalVector arguments_metadata; inline bool operator==(const MethodInfo &p_method) const { return id == p_method.id; } inline bool operator<(const MethodInfo &p_method) const { return id == p_method.id ? (name < p_method.name) : (id < p_method.id); } @@ -92,21 +92,17 @@ struct MethodInfo { template MethodInfo::MethodInfo(StringName p_name, const Args &...args) : - name(p_name), flags(GDEXTENSION_METHOD_FLAG_NORMAL) { - arguments = { args... }; -} + name(p_name), flags(GDEXTENSION_METHOD_FLAG_NORMAL), arguments({ args... }) {} template MethodInfo::MethodInfo(Variant::Type ret, StringName p_name, const Args &...args) : - name(p_name), flags(GDEXTENSION_METHOD_FLAG_NORMAL) { + name(p_name), flags(GDEXTENSION_METHOD_FLAG_NORMAL), arguments({ args... }) { return_val.type = ret; - arguments = { args... }; } template MethodInfo::MethodInfo(const PropertyInfo &p_ret, StringName p_name, const Args &...args) : - name(p_name), return_val(p_ret), flags(GDEXTENSION_METHOD_FLAG_NORMAL) { - arguments = { args... }; + name(p_name), return_val(p_ret), flags(GDEXTENSION_METHOD_FLAG_NORMAL), arguments({ args... }) { } class ObjectDB { diff --git a/src/core/class_db.cpp b/src/core/class_db.cpp index a9bfacb16..4846281b1 100644 --- a/src/core/class_db.cpp +++ b/src/core/class_db.cpp @@ -36,13 +36,11 @@ #include -#include - namespace godot { std::unordered_map ClassDB::classes; std::unordered_map ClassDB::instance_binding_callbacks; -std::vector ClassDB::class_register_order; +LocalVector ClassDB::class_register_order; std::unordered_map ClassDB::engine_singletons; std::mutex ClassDB::engine_singletons_mutex; GDExtensionInitializationLevel ClassDB::current_level = GDEXTENSION_INITIALIZATION_CORE; @@ -157,7 +155,7 @@ MethodBind *ClassDB::bind_methodfi(uint32_t p_flags, MethodBind *p_bind, const M p_bind->set_hint_flags(p_flags); - std::vector args; + LocalVector args; args.resize(method_name.args.size()); size_t arg_index = 0; for (StringName arg : method_name.args) { @@ -166,7 +164,7 @@ MethodBind *ClassDB::bind_methodfi(uint32_t p_flags, MethodBind *p_bind, const M p_bind->set_argument_names(args); - std::vector defvals; + LocalVector defvals; defvals.resize(p_defcount); for (int i = 0; i < p_defcount; i++) { @@ -186,34 +184,34 @@ MethodBind *ClassDB::bind_methodfi(uint32_t p_flags, MethodBind *p_bind, const M } void ClassDB::bind_method_godot(const StringName &p_class_name, MethodBind *p_method) { - std::vector def_args; - const std::vector &def_args_val = p_method->get_default_arguments(); + LocalVector def_args; + const LocalVector &def_args_val = p_method->get_default_arguments(); def_args.resize(def_args_val.size()); for (size_t i = 0; i < def_args_val.size(); i++) { def_args[i] = (GDExtensionVariantPtr)&def_args_val[i]; } - std::vector return_value_and_arguments_info = p_method->get_arguments_info_list(); - std::vector return_value_and_arguments_metadata = p_method->get_arguments_metadata_list(); + LocalVector return_value_and_arguments_info = p_method->get_arguments_info_list(); + LocalVector return_value_and_arguments_metadata = p_method->get_arguments_metadata_list(); - std::vector return_value_and_arguments_gdextension_info; + LocalVector return_value_and_arguments_gdextension_info; return_value_and_arguments_gdextension_info.reserve(return_value_and_arguments_info.size()); - for (std::vector::iterator it = return_value_and_arguments_info.begin(); it != return_value_and_arguments_info.end(); it++) { + for (const PropertyInfo &info : return_value_and_arguments_info) { return_value_and_arguments_gdextension_info.push_back( GDExtensionPropertyInfo{ - static_cast(it->type), // GDExtensionVariantType type; - it->name._native_ptr(), // GDExtensionStringNamePtr name; - it->class_name._native_ptr(), // GDExtensionStringNamePtr class_name; - it->hint, // uint32_t hint; - it->hint_string._native_ptr(), // GDExtensionStringPtr hint_string; - it->usage, // uint32_t usage; + static_cast(info.type), // GDExtensionVariantType type; + info.name._native_ptr(), // GDExtensionStringNamePtr name; + info.class_name._native_ptr(), // GDExtensionStringNamePtr class_name; + info.hint, // uint32_t hint; + info.hint_string._native_ptr(), // GDExtensionStringPtr hint_string; + info.usage, // uint32_t usage; }); } - GDExtensionPropertyInfo *return_value_info = return_value_and_arguments_gdextension_info.data(); - GDExtensionClassMethodArgumentMetadata *return_value_metadata = return_value_and_arguments_metadata.data(); - GDExtensionPropertyInfo *arguments_info = return_value_and_arguments_gdextension_info.data() + 1; - GDExtensionClassMethodArgumentMetadata *arguments_metadata = return_value_and_arguments_metadata.data() + 1; + GDExtensionPropertyInfo *return_value_info = return_value_and_arguments_gdextension_info.ptr(); + GDExtensionClassMethodArgumentMetadata *return_value_metadata = return_value_and_arguments_metadata.ptr(); + GDExtensionPropertyInfo *arguments_info = return_value_and_arguments_gdextension_info.ptr() + 1; + GDExtensionClassMethodArgumentMetadata *arguments_metadata = return_value_and_arguments_metadata.ptr() + 1; StringName name = p_method->get_name(); GDExtensionClassMethodInfo method_info = { @@ -229,7 +227,7 @@ void ClassDB::bind_method_godot(const StringName &p_class_name, MethodBind *p_me arguments_info, // GDExtensionPropertyInfo * arguments_metadata, // GDExtensionClassMethodArgumentMetadata * (uint32_t)p_method->get_default_argument_count(), // uint32_t default_argument_count; - def_args.data(), // GDExtensionVariantPtr *default_arguments; + def_args.ptr(), // GDExtensionVariantPtr *default_arguments; }; internal::gdextension_interface_classdb_register_extension_class_method(internal::library, p_class_name._native_ptr(), &method_info); } @@ -252,7 +250,7 @@ void ClassDB::add_signal(const StringName &p_class, const MethodInfo &p_signal) cl.signal_names.insert(p_signal.name); // register our signal in godot - std::vector parameters; + LocalVector parameters; parameters.reserve(p_signal.arguments.size()); for (const PropertyInfo &par : p_signal.arguments) { @@ -266,7 +264,7 @@ void ClassDB::add_signal(const StringName &p_class, const MethodInfo &p_signal) }); } - internal::gdextension_interface_classdb_register_extension_class_signal(internal::library, cl.name._native_ptr(), p_signal.name._native_ptr(), parameters.data(), parameters.size()); + internal::gdextension_interface_classdb_register_extension_class_signal(internal::library, cl.name._native_ptr(), p_signal.name._native_ptr(), parameters.ptr(), parameters.size()); } void ClassDB::bind_integer_constant(const StringName &p_class_name, const StringName &p_enum_name, const StringName &p_constant_name, GDExtensionInt p_constant_value, bool p_is_bitfield) { @@ -413,8 +411,8 @@ void ClassDB::initialize(GDExtensionInitializationLevel p_level) { void ClassDB::deinitialize(GDExtensionInitializationLevel p_level) { std::set to_erase; - for (std::vector::reverse_iterator i = class_register_order.rbegin(); i != class_register_order.rend(); ++i) { - const StringName &name = *i; + for (int i = class_register_order.size() - 1; i >= 0; --i) { + const StringName &name = class_register_order[i]; const ClassInfo &cl = classes[name]; if (cl.level != p_level) { @@ -432,17 +430,15 @@ void ClassDB::deinitialize(GDExtensionInitializationLevel p_level) { } { - // The following is equivalent to c++20 `std::erase_if(class_register_order, [&](const StringName& name){ return to_erase.contains(name); });` - std::vector::iterator it = std::remove_if(class_register_order.begin(), class_register_order.end(), [&](const StringName &p_name) { - return to_erase.count(p_name) > 0; - }); - class_register_order.erase(it, class_register_order.end()); + for (const StringName &x : to_erase) { + class_register_order.erase(x); + } } if (p_level == GDEXTENSION_INITIALIZATION_CORE) { // Make a new list of the singleton objects, since freeing the instance bindings will lead to // elements getting removed from engine_singletons. - std::vector singleton_objects; + LocalVector singleton_objects; { std::lock_guard lock(engine_singletons_mutex); singleton_objects.reserve(engine_singletons.size()); @@ -450,8 +446,8 @@ void ClassDB::deinitialize(GDExtensionInitializationLevel p_level) { singleton_objects.push_back(pair.second); } } - for (std::vector::iterator i = singleton_objects.begin(); i != singleton_objects.end(); i++) { - internal::gdextension_interface_object_free_instance_binding((*i)->_owner, internal::token); + for (const Object *i : singleton_objects) { + internal::gdextension_interface_object_free_instance_binding((*i)._owner, internal::token); } } } diff --git a/src/core/method_bind.cpp b/src/core/method_bind.cpp index 734b2e692..9eba6854b 100644 --- a/src/core/method_bind.cpp +++ b/src/core/method_bind.cpp @@ -56,11 +56,11 @@ void MethodBind::set_name(const StringName &p_name) { name = p_name; } -void MethodBind::set_argument_names(const std::vector &p_names) { +void MethodBind::set_argument_names(const LocalVector &p_names) { argument_names = p_names; } -std::vector MethodBind::get_argument_names() const { +LocalVector MethodBind::get_argument_names() const { return argument_names; } diff --git a/src/core/object.cpp b/src/core/object.cpp index 410daf856..d30f6cd0c 100644 --- a/src/core/object.cpp +++ b/src/core/object.cpp @@ -60,7 +60,7 @@ Object *get_object_instance_binding(GodotObject *p_engine_object) { return reinterpret_cast(gdextension_interface_object_get_instance_binding(p_engine_object, token, binding_callbacks)); } -TypedArray convert_property_list(const std::vector &p_list) { +TypedArray convert_property_list(const LocalVector &p_list) { TypedArray va; for (const PropertyInfo &pi : p_list) { va.push_back(Dictionary(pi));