HashCode.hpp 2.4 KB

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