Skip to content

Commit 9d0f9d8

Browse files
committed
Replace unordered_map with HashMap
1 parent 24d79ab commit 9d0f9d8

File tree

2 files changed

+42
-50
lines changed

2 files changed

+42
-50
lines changed

include/godot_cpp/core/class_db.hpp

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -47,17 +47,9 @@
4747
#include <list>
4848
#include <mutex>
4949
#include <set>
50-
#include <string>
51-
#include <unordered_map>
5250
#include <vector>
5351

54-
// Needed to use StringName as key in `std::unordered_map`
55-
template <>
56-
struct std::hash<godot::StringName> {
57-
std::size_t operator()(godot::StringName const &s) const noexcept {
58-
return s.hash();
59-
}
60-
};
52+
#include <godot_cpp/templates/hash_map.hpp>
6153

6254
namespace godot {
6355

@@ -95,9 +87,9 @@ class ClassDB {
9587
StringName name;
9688
StringName parent_name;
9789
GDExtensionInitializationLevel level = GDEXTENSION_INITIALIZATION_SCENE;
98-
std::unordered_map<StringName, MethodBind *> method_map;
90+
HashMap<StringName, MethodBind *> method_map;
9991
std::set<StringName> signal_names;
100-
std::unordered_map<StringName, VirtualMethod> virtual_methods;
92+
HashMap<StringName, VirtualMethod> virtual_methods;
10193
std::set<StringName> property_names;
10294
std::set<StringName> constant_names;
10395
// Pointer to the parent custom class, if any. Will be null if the parent class is a Godot class.
@@ -106,11 +98,11 @@ class ClassDB {
10698

10799
private:
108100
// This may only contain custom classes, not Godot classes
109-
static std::unordered_map<StringName, ClassInfo> classes;
110-
static std::unordered_map<StringName, const GDExtensionInstanceBindingCallbacks *> instance_binding_callbacks;
101+
static HashMap<StringName, ClassInfo> classes;
102+
static HashMap<StringName, const GDExtensionInstanceBindingCallbacks *> instance_binding_callbacks;
111103
// Used to remember the custom class registration order.
112104
static std::vector<StringName> class_register_order;
113-
static std::unordered_map<StringName, Object *> engine_singletons;
105+
static HashMap<StringName, Object *> engine_singletons;
114106
static std::mutex engine_singletons_mutex;
115107

116108
static MethodBind *bind_methodfi(uint32_t p_flags, MethodBind *p_bind, const MethodDefinition &method_name, const void **p_defs, int p_defcount);
@@ -171,9 +163,9 @@ class ClassDB {
171163

172164
static void _register_engine_singleton(const StringName &p_class_name, Object *p_singleton) {
173165
std::lock_guard<std::mutex> lock(engine_singletons_mutex);
174-
std::unordered_map<StringName, Object *>::const_iterator i = engine_singletons.find(p_class_name);
166+
HashMap<StringName, Object *>::ConstIterator i = engine_singletons.find(p_class_name);
175167
if (i != engine_singletons.end()) {
176-
ERR_FAIL_COND((*i).second != p_singleton);
168+
ERR_FAIL_COND((*i).value != p_singleton);
177169
return;
178170
}
179171
engine_singletons[p_class_name] = p_singleton;
@@ -243,10 +235,10 @@ void ClassDB::_register_class(bool p_virtual, bool p_exposed, bool p_runtime) {
243235
cl.name = T::get_class_static();
244236
cl.parent_name = T::get_parent_class_static();
245237
cl.level = current_level;
246-
std::unordered_map<StringName, ClassInfo>::iterator parent_it = classes.find(cl.parent_name);
238+
HashMap<StringName, ClassInfo>::Iterator parent_it = classes.find(cl.parent_name);
247239
if (parent_it != classes.end()) {
248240
// Assign parent if it is also a custom class
249-
cl.parent_ptr = &parent_it->second;
241+
cl.parent_ptr = &parent_it->value;
250242
}
251243
classes[cl.name] = cl;
252244
class_register_order.push_back(cl.name);
@@ -340,13 +332,13 @@ MethodBind *ClassDB::bind_vararg_method(uint32_t p_flags, StringName p_name, M p
340332

341333
StringName instance_type = bind->get_instance_class();
342334

343-
std::unordered_map<StringName, ClassInfo>::iterator type_it = classes.find(instance_type);
335+
HashMap<StringName, ClassInfo>::Iterator type_it = classes.find(instance_type);
344336
if (type_it == classes.end()) {
345337
memdelete(bind);
346338
ERR_FAIL_V_MSG(nullptr, String("Class '{0}' doesn't exist.").format(Array::make(instance_type)));
347339
}
348340

349-
ClassInfo &type = type_it->second;
341+
ClassInfo &type = type_it->value;
350342

351343
if (type.method_map.find(p_name) != type.method_map.end()) {
352344
memdelete(bind);

src/core/class_db.cpp

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@
4040

4141
namespace godot {
4242

43-
std::unordered_map<StringName, ClassDB::ClassInfo> ClassDB::classes;
44-
std::unordered_map<StringName, const GDExtensionInstanceBindingCallbacks *> ClassDB::instance_binding_callbacks;
43+
HashMap<StringName, ClassDB::ClassInfo> ClassDB::classes;
44+
HashMap<StringName, const GDExtensionInstanceBindingCallbacks *> ClassDB::instance_binding_callbacks;
4545
std::vector<StringName> ClassDB::class_register_order;
46-
std::unordered_map<StringName, Object *> ClassDB::engine_singletons;
46+
HashMap<StringName, Object *> ClassDB::engine_singletons;
4747
std::mutex ClassDB::engine_singletons_mutex;
4848
GDExtensionInitializationLevel ClassDB::current_level = GDEXTENSION_INITIALIZATION_CORE;
4949

@@ -116,9 +116,9 @@ MethodBind *ClassDB::get_method(const StringName &p_class, const StringName &p_m
116116

117117
ClassInfo *type = &classes[p_class];
118118
while (type) {
119-
std::unordered_map<StringName, MethodBind *>::iterator method = type->method_map.find(p_method);
119+
HashMap<StringName, MethodBind *>::Iterator method = type->method_map.find(p_method);
120120
if (method != type->method_map.end()) {
121-
return method->second;
121+
return method->value;
122122
}
123123
type = type->parent_ptr;
124124
continue;
@@ -130,13 +130,13 @@ MethodBind *ClassDB::get_method(const StringName &p_class, const StringName &p_m
130130
MethodBind *ClassDB::bind_methodfi(uint32_t p_flags, MethodBind *p_bind, const MethodDefinition &method_name, const void **p_defs, int p_defcount) {
131131
StringName instance_type = p_bind->get_instance_class();
132132

133-
std::unordered_map<StringName, ClassInfo>::iterator type_it = classes.find(instance_type);
133+
HashMap<StringName, ClassInfo>::Iterator type_it = classes.find(instance_type);
134134
if (type_it == classes.end()) {
135135
memdelete(p_bind);
136136
ERR_FAIL_V_MSG(nullptr, String("Class '{0}' doesn't exist.").format(Array::make(instance_type)));
137137
}
138138

139-
ClassInfo &type = type_it->second;
139+
ClassInfo &type = type_it->value;
140140

141141
if (type.method_map.find(method_name.name) != type.method_map.end()) {
142142
memdelete(p_bind);
@@ -235,11 +235,11 @@ void ClassDB::bind_method_godot(const StringName &p_class_name, MethodBind *p_me
235235
}
236236

237237
void ClassDB::add_signal(const StringName &p_class, const MethodInfo &p_signal) {
238-
std::unordered_map<StringName, ClassInfo>::iterator type_it = classes.find(p_class);
238+
HashMap<StringName, ClassInfo>::Iterator type_it = classes.find(p_class);
239239

240240
ERR_FAIL_COND_MSG(type_it == classes.end(), String("Class '{0}' doesn't exist.").format(Array::make(p_class)));
241241

242-
ClassInfo &cl = type_it->second;
242+
ClassInfo &cl = type_it->value;
243243

244244
// Check if this signal is already register
245245
ClassInfo *check = &cl;
@@ -270,11 +270,11 @@ void ClassDB::add_signal(const StringName &p_class, const MethodInfo &p_signal)
270270
}
271271

272272
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) {
273-
std::unordered_map<StringName, ClassInfo>::iterator type_it = classes.find(p_class_name);
273+
HashMap<StringName, ClassInfo>::Iterator type_it = classes.find(p_class_name);
274274

275275
ERR_FAIL_COND_MSG(type_it == classes.end(), String("Class '{0}' doesn't exist.").format(Array::make(p_class_name)));
276276

277-
ClassInfo &type = type_it->second;
277+
ClassInfo &type = type_it->value;
278278

279279
// check if it already exists
280280
ERR_FAIL_COND_MSG(type.constant_names.find(p_constant_name) != type.constant_names.end(), String("Constant '{0}::{1}' already registered.").format(Array::make(p_class_name, p_constant_name)));
@@ -292,17 +292,17 @@ GDExtensionClassCallVirtual ClassDB::get_virtual_func(void *p_userdata, GDExtens
292292
const StringName *class_name = reinterpret_cast<const StringName *>(p_userdata);
293293
const StringName *name = reinterpret_cast<const StringName *>(p_name);
294294

295-
std::unordered_map<StringName, ClassInfo>::iterator type_it = classes.find(*class_name);
295+
HashMap<StringName, ClassInfo>::Iterator type_it = classes.find(*class_name);
296296
ERR_FAIL_COND_V_MSG(type_it == classes.end(), nullptr, String("Class '{0}' doesn't exist.").format(Array::make(*class_name)));
297297

298-
const ClassInfo *type = &type_it->second;
298+
const ClassInfo *type = &type_it->value;
299299

300300
// Find method in current class, or any of its parent classes (Godot classes not included)
301301
while (type != nullptr) {
302-
std::unordered_map<StringName, ClassInfo::VirtualMethod>::const_iterator method_it = type->virtual_methods.find(*name);
302+
HashMap<StringName, ClassInfo::VirtualMethod>::ConstIterator method_it = type->virtual_methods.find(*name);
303303

304-
if (method_it != type->virtual_methods.end() && method_it->second.hash == p_hash) {
305-
return method_it->second.func;
304+
if (method_it != type->virtual_methods.end() && method_it->value.hash == p_hash) {
305+
return method_it->value.func;
306306
}
307307

308308
type = type->parent_ptr;
@@ -312,9 +312,9 @@ GDExtensionClassCallVirtual ClassDB::get_virtual_func(void *p_userdata, GDExtens
312312
}
313313

314314
const GDExtensionInstanceBindingCallbacks *ClassDB::get_instance_binding_callbacks(const StringName &p_class) {
315-
std::unordered_map<StringName, const GDExtensionInstanceBindingCallbacks *>::iterator callbacks_it = instance_binding_callbacks.find(p_class);
315+
HashMap<StringName, const GDExtensionInstanceBindingCallbacks *>::Iterator callbacks_it = instance_binding_callbacks.find(p_class);
316316
if (likely(callbacks_it != instance_binding_callbacks.end())) {
317-
return callbacks_it->second;
317+
return callbacks_it->value;
318318
}
319319

320320
// If we don't have an instance binding callback for the given class, find the closest parent where we do.
@@ -325,14 +325,14 @@ const GDExtensionInstanceBindingCallbacks *ClassDB::get_instance_binding_callbac
325325
callbacks_it = instance_binding_callbacks.find(class_name);
326326
} while (callbacks_it == instance_binding_callbacks.end());
327327

328-
return callbacks_it->second;
328+
return callbacks_it->value;
329329
}
330330

331331
void ClassDB::bind_virtual_method(const StringName &p_class, const StringName &p_method, GDExtensionClassCallVirtual p_call, uint32_t p_hash) {
332-
std::unordered_map<StringName, ClassInfo>::iterator type_it = classes.find(p_class);
332+
HashMap<StringName, ClassInfo>::Iterator type_it = classes.find(p_class);
333333
ERR_FAIL_COND_MSG(type_it == classes.end(), String("Class '{0}' doesn't exist.").format(Array::make(p_class)));
334334

335-
ClassInfo &type = type_it->second;
335+
ClassInfo &type = type_it->value;
336336

337337
ERR_FAIL_COND_MSG(type.method_map.find(p_method) != type.method_map.end(), String("Method '{0}::{1}()' already registered as non-virtual.").format(Array::make(p_class, p_method)));
338338
ERR_FAIL_COND_MSG(type.virtual_methods.find(p_method) != type.virtual_methods.end(), String("Virtual '{0}::{1}()' method already registered.").format(Array::make(p_class, p_method)));
@@ -344,7 +344,7 @@ void ClassDB::bind_virtual_method(const StringName &p_class, const StringName &p
344344
}
345345

346346
void ClassDB::add_virtual_method(const StringName &p_class, const MethodInfo &p_method, const Vector<StringName> &p_arg_names) {
347-
std::unordered_map<StringName, ClassInfo>::iterator type_it = classes.find(p_class);
347+
HashMap<StringName, ClassInfo>::Iterator type_it = classes.find(p_class);
348348
ERR_FAIL_COND_MSG(type_it == classes.end(), String("Class '{0}' doesn't exist.").format(Array::make(p_class)));
349349

350350
GDExtensionClassVirtualMethodInfo mi;
@@ -392,17 +392,17 @@ void ClassDB::_editor_get_classes_used_callback(GDExtensionTypePtr p_packed_stri
392392
PackedStringArray *arr = reinterpret_cast<PackedStringArray *>(p_packed_string_array);
393393
arr->resize(instance_binding_callbacks.size());
394394
int index = 0;
395-
for (const std::pair<const StringName, const GDExtensionInstanceBindingCallbacks *> &pair : instance_binding_callbacks) {
396-
(*arr)[index++] = pair.first;
395+
for (const KeyValue<StringName, const GDExtensionInstanceBindingCallbacks *> &pair : instance_binding_callbacks) {
396+
(*arr)[index++] = pair.key;
397397
}
398398
}
399399

400400
void ClassDB::initialize_class(const ClassInfo &p_cl) {
401401
}
402402

403403
void ClassDB::initialize(GDExtensionInitializationLevel p_level) {
404-
for (const std::pair<const StringName, ClassInfo> &pair : classes) {
405-
const ClassInfo &cl = pair.second;
404+
for (const KeyValue<StringName, ClassInfo> &pair : classes) {
405+
const ClassInfo &cl = pair.value;
406406
if (cl.level != p_level) {
407407
continue;
408408
}
@@ -423,8 +423,8 @@ void ClassDB::deinitialize(GDExtensionInitializationLevel p_level) {
423423

424424
internal::gdextension_interface_classdb_unregister_extension_class(internal::library, name._native_ptr());
425425

426-
for (const std::pair<const StringName, MethodBind *> &method : cl.method_map) {
427-
memdelete(method.second);
426+
for (const KeyValue<StringName, MethodBind *> &method : cl.method_map) {
427+
memdelete(method.value);
428428
}
429429

430430
classes.erase(name);
@@ -446,8 +446,8 @@ void ClassDB::deinitialize(GDExtensionInitializationLevel p_level) {
446446
{
447447
std::lock_guard<std::mutex> lock(engine_singletons_mutex);
448448
singleton_objects.reserve(engine_singletons.size());
449-
for (const std::pair<const StringName, Object *> &pair : engine_singletons) {
450-
singleton_objects.push_back(pair.second);
449+
for (const KeyValue<StringName, Object *> &pair : engine_singletons) {
450+
singleton_objects.push_back(pair.value);
451451
}
452452
}
453453
for (std::vector<Object *>::iterator i = singleton_objects.begin(); i != singleton_objects.end(); i++) {

0 commit comments

Comments
 (0)