StringHash.cpp 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // Copyright (c) 2008-2023 the Urho3D project
  2. // License: MIT
  3. #include "../Precompiled.h"
  4. #include "../Container/HashMap.h"
  5. #include "../Core/StringHashRegister.h"
  6. #include "../IO/Log.h"
  7. #include "../Math/StringHash.h"
  8. #include <cstdio>
  9. #include "../DebugNew.h"
  10. namespace Urho3D
  11. {
  12. #ifdef URHO3D_HASH_DEBUG
  13. // Expose map to let Visual Studio debugger access it if Urho3D is linked statically.
  14. const StringMap* hashReverseMap = nullptr;
  15. // Hide static global variables in functions to ensure initialization order.
  16. static StringHashRegister& GetGlobalStringHashRegister()
  17. {
  18. static StringHashRegister stringHashRegister(true /*thread safe*/ );
  19. hashReverseMap = &stringHashRegister.GetInternalMap();
  20. return stringHashRegister;
  21. }
  22. #endif
  23. const StringHash StringHash::ZERO;
  24. #ifdef URHO3D_HASH_DEBUG
  25. StringHash::StringHash(const char* str) noexcept :
  26. value_(Calculate(str))
  27. {
  28. Urho3D::GetGlobalStringHashRegister().RegisterString(*this, str);
  29. }
  30. #endif
  31. StringHash::StringHash(const String& str) noexcept :
  32. value_(Calculate(str.CString()))
  33. {
  34. #ifdef URHO3D_HASH_DEBUG
  35. Urho3D::GetGlobalStringHashRegister().RegisterString(*this, str.CString());
  36. #endif
  37. }
  38. StringHashRegister* StringHash::GetGlobalStringHashRegister()
  39. {
  40. #ifdef URHO3D_HASH_DEBUG
  41. return &Urho3D::GetGlobalStringHashRegister();
  42. #else
  43. return nullptr;
  44. #endif
  45. }
  46. String StringHash::ToString() const
  47. {
  48. char tempBuffer[CONVERSION_BUFFER_LENGTH];
  49. sprintf(tempBuffer, "%08X", value_);
  50. return String(tempBuffer);
  51. }
  52. String StringHash::Reverse() const
  53. {
  54. #ifdef URHO3D_HASH_DEBUG
  55. return Urho3D::GetGlobalStringHashRegister().GetStringCopy(*this);
  56. #else
  57. return String::EMPTY;
  58. #endif
  59. }
  60. }