HashCode.hpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #ifndef CORE_HPPASH_CODE_HPP
  2. #define CORE_HPPASH_CODE_HPP
  3. #include <limits.h>
  4. #include "core/utils/Types.hpp"
  5. namespace Core {
  6. template<typename H>
  7. inline u64 hashCode(const H& key) {
  8. return key.hashCode();
  9. }
  10. template<typename T>
  11. inline u64 hashNumber(T t) {
  12. static_assert(sizeof(t) <= 8);
  13. return static_cast<u64>(t);
  14. }
  15. inline u64 hashCode(char key) {
  16. return hashNumber(key);
  17. }
  18. inline u64 hashCode(signed char key) {
  19. return hashNumber(key);
  20. }
  21. inline u64 hashCode(signed short key) {
  22. return hashNumber(key);
  23. }
  24. inline u64 hashCode(signed int key) {
  25. return hashNumber(key);
  26. }
  27. inline u64 hashCode(signed long key) {
  28. return hashNumber(key);
  29. }
  30. inline u64 hashCode(signed long long key) {
  31. return hashNumber(key);
  32. }
  33. inline u64 hashCode(unsigned char key) {
  34. return hashNumber(key);
  35. }
  36. inline u64 hashCode(unsigned short key) {
  37. return hashNumber(key);
  38. }
  39. inline u64 hashCode(unsigned int key) {
  40. return hashNumber(key);
  41. }
  42. inline u64 hashCode(unsigned long key) {
  43. return hashNumber(key);
  44. }
  45. inline u64 hashCode(unsigned long long key) {
  46. return hashNumber(key);
  47. }
  48. template<typename T>
  49. inline consteval T emptyValue() {
  50. if constexpr(Core::IsSame<char, T>) {
  51. return CHAR_MAX;
  52. } else if constexpr(Core::IsSame<signed char, T>) {
  53. return SCHAR_MAX;
  54. } else if constexpr(Core::IsSame<signed short, T>) {
  55. return SHRT_MAX;
  56. } else if constexpr(Core::IsSame<signed int, T>) {
  57. return INT_MAX;
  58. } else if constexpr(Core::IsSame<signed long, T>) {
  59. return LONG_MAX;
  60. } else if constexpr(Core::IsSame<signed long long, T>) {
  61. return LLONG_MAX;
  62. } else if constexpr(Core::IsSame<unsigned char, T>) {
  63. return UCHAR_MAX;
  64. } else if constexpr(Core::IsSame<unsigned short, T>) {
  65. return USHRT_MAX;
  66. } else if constexpr(Core::IsSame<unsigned int, T>) {
  67. return UINT_MAX;
  68. } else if constexpr(Core::IsSame<unsigned long, T>) {
  69. return ULONG_MAX;
  70. } else if constexpr(Core::IsSame<unsigned long long, T>) {
  71. return ULLONG_MAX;
  72. } else {
  73. return T::emptyValue();
  74. }
  75. }
  76. }
  77. #endif