StringHashRegister.cpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // Copyright (c) 2008-2023 the Urho3D project
  2. // License: MIT
  3. #include "../Precompiled.h"
  4. #include "../Core/StringHashRegister.h"
  5. #include "../Core/Mutex.h"
  6. #include "../IO/Log.h"
  7. #include <cstdio>
  8. #include "../DebugNew.h"
  9. using namespace std;
  10. namespace Urho3D
  11. {
  12. StringHashRegister::StringHashRegister(bool threadSafe)
  13. {
  14. if (threadSafe)
  15. mutex_ = make_unique<Mutex>();
  16. }
  17. StringHashRegister::~StringHashRegister() // NOLINT(hicpp-use-equals-default, modernize-use-equals-default)
  18. {
  19. // Keep destructor here to let mutex_ destruct
  20. }
  21. StringHash StringHashRegister::RegisterString(const StringHash& hash, const char* string)
  22. {
  23. if (mutex_)
  24. mutex_->Acquire();
  25. auto iter = map_.Find(hash);
  26. if (iter == map_.End())
  27. {
  28. map_.Populate(hash, string);
  29. }
  30. else if (iter->second_.Compare(string, false) != 0)
  31. {
  32. URHO3D_LOGWARNINGF("StringHash collision detected! Both \"%s\" and \"%s\" have hash #%s",
  33. string, iter->second_.CString(), hash.ToString().CString());
  34. }
  35. if (mutex_)
  36. mutex_->Release();
  37. return hash;
  38. }
  39. StringHash StringHashRegister::RegisterString(const char* string)
  40. {
  41. StringHash hash(string);
  42. return RegisterString(hash, string);
  43. }
  44. String StringHashRegister::GetStringCopy(const StringHash& hash) const
  45. {
  46. if (mutex_)
  47. mutex_->Acquire();
  48. const String copy = GetString(hash);
  49. if (mutex_)
  50. mutex_->Release();
  51. return copy;
  52. }
  53. bool StringHashRegister::Contains(const StringHash& hash) const
  54. {
  55. if (mutex_)
  56. mutex_->Acquire();
  57. const bool contains = map_.Contains(hash);
  58. if (mutex_)
  59. mutex_->Release();
  60. return contains;
  61. }
  62. const String& StringHashRegister::GetString(const StringHash& hash) const
  63. {
  64. auto iter = map_.Find(hash);
  65. return iter == map_.End() ? String::EMPTY : iter->second_;
  66. }
  67. }