diff options
Diffstat (limited to 'core/string_name.cpp')
-rw-r--r-- | core/string_name.cpp | 144 |
1 files changed, 50 insertions, 94 deletions
diff --git a/core/string_name.cpp b/core/string_name.cpp index 6f7b10c5fe..6260e3ce8c 100644 --- a/core/string_name.cpp +++ b/core/string_name.cpp @@ -42,34 +42,26 @@ StaticCString StaticCString::create(const char *p_ptr) { StringName::_Data *StringName::_table[STRING_TABLE_LEN]; StringName _scs_create(const char *p_chr) { - return (p_chr[0] ? StringName(StaticCString::create(p_chr)) : StringName()); } bool StringName::configured = false; -Mutex *StringName::lock = NULL; +Mutex StringName::mutex; void StringName::setup() { - - lock = Mutex::create(); - ERR_FAIL_COND(configured); for (int i = 0; i < STRING_TABLE_LEN; i++) { - - _table[i] = NULL; + _table[i] = nullptr; } configured = true; } void StringName::cleanup() { - - lock->lock(); + MutexLock lock(mutex); int lost_strings = 0; for (int i = 0; i < STRING_TABLE_LEN; i++) { - while (_table[i]) { - _Data *d = _table[i]; lost_strings++; if (OS::get_singleton()->is_stdout_verbose()) { @@ -87,18 +79,13 @@ void StringName::cleanup() { if (lost_strings) { print_verbose("StringName: " + itos(lost_strings) + " unclaimed string names at exit."); } - lock->unlock(); - - memdelete(lock); } void StringName::unref() { - ERR_FAIL_COND(!configured); if (_data && _data->refcount.unref()) { - - lock->lock(); + MutexLock lock(mutex); if (_data->prev) { _data->prev->next = _data->next; @@ -113,16 +100,13 @@ void StringName::unref() { _data->next->prev = _data->prev; } memdelete(_data); - lock->unlock(); } - _data = NULL; + _data = nullptr; } bool StringName::operator==(const String &p_name) const { - if (!_data) { - return (p_name.length() == 0); } @@ -130,9 +114,7 @@ bool StringName::operator==(const String &p_name) const { } bool StringName::operator==(const char *p_name) const { - if (!_data) { - return (p_name[0] == 0); } @@ -140,33 +122,29 @@ bool StringName::operator==(const char *p_name) const { } bool StringName::operator!=(const String &p_name) const { - return !(operator==(p_name)); } bool StringName::operator!=(const StringName &p_name) const { - // the real magic of all this mess happens here. // this is why path comparisons are very fast return _data != p_name._data; } void StringName::operator=(const StringName &p_name) { - - if (this == &p_name) + if (this == &p_name) { return; + } unref(); if (p_name._data && p_name._data->refcount.ref()) { - _data = p_name._data; } } StringName::StringName(const StringName &p_name) { - - _data = NULL; + _data = nullptr; ERR_FAIL_COND(!configured); @@ -176,15 +154,15 @@ StringName::StringName(const StringName &p_name) { } StringName::StringName(const char *p_name) { - - _data = NULL; + _data = nullptr; ERR_FAIL_COND(!configured); - if (!p_name || p_name[0] == 0) + if (!p_name || p_name[0] == 0) { return; //empty, ignore + } - lock->lock(); + MutexLock lock(mutex); uint32_t hash = String::hash(p_name); @@ -193,17 +171,16 @@ StringName::StringName(const char *p_name) { _data = _table[idx]; while (_data) { - // compare hash first - if (_data->hash == hash && _data->get_name() == p_name) + if (_data->hash == hash && _data->get_name() == p_name) { break; + } _data = _data->next; } if (_data) { if (_data->refcount.ref()) { // exists - lock->unlock(); return; } } @@ -213,25 +190,23 @@ StringName::StringName(const char *p_name) { _data->refcount.init(); _data->hash = hash; _data->idx = idx; - _data->cname = NULL; + _data->cname = nullptr; _data->next = _table[idx]; - _data->prev = NULL; - if (_table[idx]) + _data->prev = nullptr; + if (_table[idx]) { _table[idx]->prev = _data; + } _table[idx] = _data; - - lock->unlock(); } StringName::StringName(const StaticCString &p_static_string) { - - _data = NULL; + _data = nullptr; ERR_FAIL_COND(!configured); ERR_FAIL_COND(!p_static_string.ptr || !p_static_string.ptr[0]); - lock->lock(); + MutexLock lock(mutex); uint32_t hash = String::hash(p_static_string.ptr); @@ -240,17 +215,16 @@ StringName::StringName(const StaticCString &p_static_string) { _data = _table[idx]; while (_data) { - // compare hash first - if (_data->hash == hash && _data->get_name() == p_static_string.ptr) + if (_data->hash == hash && _data->get_name() == p_static_string.ptr) { break; + } _data = _data->next; } if (_data) { if (_data->refcount.ref()) { // exists - lock->unlock(); return; } } @@ -262,42 +236,39 @@ StringName::StringName(const StaticCString &p_static_string) { _data->idx = idx; _data->cname = p_static_string.ptr; _data->next = _table[idx]; - _data->prev = NULL; - if (_table[idx]) + _data->prev = nullptr; + if (_table[idx]) { _table[idx]->prev = _data; + } _table[idx] = _data; - - lock->unlock(); } StringName::StringName(const String &p_name) { - - _data = NULL; + _data = nullptr; ERR_FAIL_COND(!configured); - if (p_name == String()) + if (p_name == String()) { return; + } - lock->lock(); + MutexLock lock(mutex); uint32_t hash = p_name.hash(); - uint32_t idx = hash & STRING_TABLE_MASK; _data = _table[idx]; while (_data) { - - if (_data->hash == hash && _data->get_name() == p_name) + if (_data->hash == hash && _data->get_name() == p_name) { break; + } _data = _data->next; } if (_data) { if (_data->refcount.ref()) { // exists - lock->unlock(); return; } } @@ -307,59 +278,54 @@ StringName::StringName(const String &p_name) { _data->refcount.init(); _data->hash = hash; _data->idx = idx; - _data->cname = NULL; + _data->cname = nullptr; _data->next = _table[idx]; - _data->prev = NULL; - if (_table[idx]) + _data->prev = nullptr; + if (_table[idx]) { _table[idx]->prev = _data; + } _table[idx] = _data; - - lock->unlock(); } StringName StringName::search(const char *p_name) { - ERR_FAIL_COND_V(!configured, StringName()); ERR_FAIL_COND_V(!p_name, StringName()); - if (!p_name[0]) + if (!p_name[0]) { return StringName(); + } - lock->lock(); + MutexLock lock(mutex); uint32_t hash = String::hash(p_name); - uint32_t idx = hash & STRING_TABLE_MASK; _Data *_data = _table[idx]; while (_data) { - // compare hash first - if (_data->hash == hash && _data->get_name() == p_name) + if (_data->hash == hash && _data->get_name() == p_name) { break; + } _data = _data->next; } if (_data && _data->refcount.ref()) { - lock->unlock(); - return StringName(_data); } - lock->unlock(); return StringName(); //does not exist } -StringName StringName::search(const CharType *p_name) { - +StringName StringName::search(const char32_t *p_name) { ERR_FAIL_COND_V(!configured, StringName()); ERR_FAIL_COND_V(!p_name, StringName()); - if (!p_name[0]) + if (!p_name[0]) { return StringName(); + } - lock->lock(); + MutexLock lock(mutex); uint32_t hash = String::hash(p_name); @@ -368,26 +334,24 @@ StringName StringName::search(const CharType *p_name) { _Data *_data = _table[idx]; while (_data) { - // compare hash first - if (_data->hash == hash && _data->get_name() == p_name) + if (_data->hash == hash && _data->get_name() == p_name) { break; + } _data = _data->next; } if (_data && _data->refcount.ref()) { - lock->unlock(); return StringName(_data); } - lock->unlock(); return StringName(); //does not exist } -StringName StringName::search(const String &p_name) { +StringName StringName::search(const String &p_name) { ERR_FAIL_COND_V(p_name == "", StringName()); - lock->lock(); + MutexLock lock(mutex); uint32_t hash = p_name.hash(); @@ -396,28 +360,20 @@ StringName StringName::search(const String &p_name) { _Data *_data = _table[idx]; while (_data) { - // compare hash first - if (_data->hash == hash && p_name == _data->get_name()) + if (_data->hash == hash && p_name == _data->get_name()) { break; + } _data = _data->next; } if (_data && _data->refcount.ref()) { - lock->unlock(); return StringName(_data); } - lock->unlock(); return StringName(); //does not exist } -StringName::StringName() { - - _data = NULL; -} - StringName::~StringName() { - unref(); } |