29 #ifndef CDCONTAINERS_INCLUDE_CDCONTAINERS_HASH_H 30 #define CDCONTAINERS_INCLUDE_CDCONTAINERS_HASH_H 40 #define CDC_DIGITS_CHAR (CHAR_BIT - (CHAR_MIN < 0)) 41 #define CDC_DIGITS_SCHAR (CHAR_BIT - 1) 42 #define CDC_DIGITS_UCHAR (CHAR_BIT) 43 #define CDC_DIGITS_SHORT (CHAR_BIT * sizeof(short) - 1) 44 #define CDC_DIGITS_USHORT (CHAR_BIT * sizeof(short)) 45 #define CDC_DIGITS_INT (CHAR_BIT * sizeof(int) - 1) 46 #define CDC_DIGITS_UINT (CHAR_BIT * sizeof(int)) 47 #define CDC_DIGITS_LONG (CHAR_BIT * sizeof(long) - 1) 48 #define CDC_DIGITS_ULONG (CHAR_BIT * sizeof(long)) 49 #define CDC_DIGITS_SIZE (CHAR_BIT * sizeof(size_t)) 51 #define MAKE_SIGNED_HASH(T, DIGITS, NAME) \ 52 static inline size_t cdc_hash_##NAME(T val) \ 54 const unsigned int size_t_bits = CDC_DIGITS_SIZE; \ 55 const int length = (DIGITS - 1) / (int)(size_t_bits); \ 58 T positive = val < 0 ? -1 - val : val; \ 59 for (i = length * size_t_bits; i > 0; i -= size_t_bits) \ 60 seed ^= (size_t)(positive >> i) + (seed << 6) + (seed >> 2); \ 61 seed ^= (size_t)val + (seed << 6) + (seed >> 2); \ 65 #define MAKE_UNSIGNED_HASH(T, DIGITS, NAME) \ 66 static inline size_t cdc_hash_##NAME(T val) \ 68 const unsigned int size_t_bits = CDC_DIGITS_SIZE; \ 69 const int length = (DIGITS - 1) / (int)(size_t_bits); \ 72 for (i = length * size_t_bits; i > 0; i -= size_t_bits) \ 73 seed ^= (size_t)(seed >> i) + (seed << 6) + (seed >> 2); \ 74 seed ^= (size_t)val + (seed << 6) + (seed >> 2); \ 80 seed ^= value + (seed << 6) + (seed >> 2);
88 if (length >=
sizeof(
size_t)) {
89 memcpy(&seed, ptr,
sizeof(
size_t));
90 length -=
sizeof(size_t);
91 ptr +=
sizeof(size_t);
93 while (length >=
sizeof(
size_t)) {
95 memcpy(&buffer, ptr,
sizeof(
size_t));
97 length -=
sizeof(size_t);
98 ptr +=
sizeof(size_t);
104 memcpy(&buffer, ptr, length);
111 #define MAKE_FLOAT_HASH(T, NAME) \ 112 static inline size_t cdc_hash_##NAME(T val) \ 114 return cdc_hash_binary((char *)&val, sizeof(T)); \ 137 #define MAKE_POINTER_DATA_HASH(T, NAME, CAST_FUNC) \ 138 static inline size_t cdc_pdhash_##NAME(void *val) \ 140 T t = CAST_FUNC(val); \ 141 return cdc_hash_##NAME(t); \ 156 #ifdef CDC_FLOAT_CAST 159 #ifdef CDC_DOUBLE_CAST 163 #endif // CDCONTAINERS_INCLUDE_CDCONTAINERS_HASH_H #define CDC_TO_INT(p)
Definition: casts.h:44
#define CDC_TO_USHORT(p)
Definition: casts.h:41
#define MAKE_UNSIGNED_HASH(T, DIGITS, NAME)
Definition: hash.h:65
#define MAKE_SIGNED_HASH(T, DIGITS, NAME)
Definition: hash.h:51
#define CDC_TO_UCHAR(p)
Definition: casts.h:35
#define MAKE_FLOAT_HASH(T, NAME)
Definition: hash.h:111
#define CDC_TO_CHAR(p)
Definition: casts.h:29
#define CDC_DIGITS_LONG
Definition: hash.h:47
#define CDC_DIGITS_CHAR
Definition: hash.h:40
#define CDC_DIGITS_UINT
Definition: hash.h:46
#define CDC_DIGITS_UCHAR
Definition: hash.h:42
#define CDC_TO_UINT(p)
Definition: casts.h:47
#define CDC_DIGITS_INT
Definition: hash.h:45
size_t(* cdc_hash_fn_t)(void const *)
Definition: hash.h:38
#define CDC_TO_LONG(p)
Definition: casts.h:54
static size_t cdc_hash_float_combine(size_t seed, size_t value)
Definition: hash.h:78
static size_t cdc_hash_binary(char *ptr, size_t length)
Definition: hash.h:84
#define CDC_TO_SCHAR(p)
Definition: casts.h:32
#define MAKE_POINTER_DATA_HASH(T, NAME, CAST_FUNC)
Definition: hash.h:137
#define CDC_DIGITS_SHORT
Definition: hash.h:43
#define CDC_TO_ULONG(p)
Definition: casts.h:58
#define CDC_TO_SHORT(p)
Definition: casts.h:38
#define CDC_DIGITS_ULONG
Definition: hash.h:48
#define CDC_DIGITS_SCHAR
Definition: hash.h:41
#define CDC_DIGITS_USHORT
Definition: hash.h:44