102 static void XXH_free (void* p) { free(p); } |
102 static void XXH_free (void* p) { free(p); } |
103 /* for memcpy() */ |
103 /* for memcpy() */ |
104 #include <string.h> |
104 #include <string.h> |
105 static void* XXH_memcpy(void* dest, const void* src, size_t size) { return memcpy(dest,src,size); } |
105 static void* XXH_memcpy(void* dest, const void* src, size_t size) { return memcpy(dest,src,size); } |
106 |
106 |
107 #define XXH_STATIC_LINKING_ONLY |
107 #ifndef XXH_STATIC_LINKING_ONLY |
|
108 # define XXH_STATIC_LINKING_ONLY |
|
109 #endif |
108 #include "xxhash.h" |
110 #include "xxhash.h" |
109 |
111 |
110 |
112 |
111 /* ************************************* |
113 /* ************************************* |
112 * Compiler Specific Options |
114 * Compiler Specific Options |
113 ***************************************/ |
115 ***************************************/ |
114 #ifdef _MSC_VER /* Visual Studio */ |
116 #if defined (__GNUC__) || defined(__cplusplus) || defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */ |
|
117 # define INLINE_KEYWORD inline |
|
118 #else |
|
119 # define INLINE_KEYWORD |
|
120 #endif |
|
121 |
|
122 #if defined(__GNUC__) |
|
123 # define FORCE_INLINE_ATTR __attribute__((always_inline)) |
|
124 #elif defined(_MSC_VER) |
|
125 # define FORCE_INLINE_ATTR __forceinline |
|
126 #else |
|
127 # define FORCE_INLINE_ATTR |
|
128 #endif |
|
129 |
|
130 #define FORCE_INLINE_TEMPLATE static INLINE_KEYWORD FORCE_INLINE_ATTR |
|
131 |
|
132 |
|
133 #ifdef _MSC_VER |
115 # pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ |
134 # pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ |
116 # define FORCE_INLINE static __forceinline |
|
117 #else |
|
118 # if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */ |
|
119 # ifdef __GNUC__ |
|
120 # define FORCE_INLINE static inline __attribute__((always_inline)) |
|
121 # else |
|
122 # define FORCE_INLINE static inline |
|
123 # endif |
|
124 # else |
|
125 # define FORCE_INLINE static |
|
126 # endif /* __STDC_VERSION__ */ |
|
127 #endif |
135 #endif |
128 |
136 |
129 |
137 |
130 /* ************************************* |
138 /* ************************************* |
131 * Basic Types |
139 * Basic Types |
244 /* *************************** |
252 /* *************************** |
245 * Memory reads |
253 * Memory reads |
246 *****************************/ |
254 *****************************/ |
247 typedef enum { XXH_aligned, XXH_unaligned } XXH_alignment; |
255 typedef enum { XXH_aligned, XXH_unaligned } XXH_alignment; |
248 |
256 |
249 FORCE_INLINE U32 XXH_readLE32_align(const void* ptr, XXH_endianess endian, XXH_alignment align) |
257 FORCE_INLINE_TEMPLATE U32 XXH_readLE32_align(const void* ptr, XXH_endianess endian, XXH_alignment align) |
250 { |
258 { |
251 if (align==XXH_unaligned) |
259 if (align==XXH_unaligned) |
252 return endian==XXH_littleEndian ? XXH_read32(ptr) : XXH_swap32(XXH_read32(ptr)); |
260 return endian==XXH_littleEndian ? XXH_read32(ptr) : XXH_swap32(XXH_read32(ptr)); |
253 else |
261 else |
254 return endian==XXH_littleEndian ? *(const U32*)ptr : XXH_swap32(*(const U32*)ptr); |
262 return endian==XXH_littleEndian ? *(const U32*)ptr : XXH_swap32(*(const U32*)ptr); |
255 } |
263 } |
256 |
264 |
257 FORCE_INLINE U32 XXH_readLE32(const void* ptr, XXH_endianess endian) |
265 FORCE_INLINE_TEMPLATE U32 XXH_readLE32(const void* ptr, XXH_endianess endian) |
258 { |
266 { |
259 return XXH_readLE32_align(ptr, endian, XXH_unaligned); |
267 return XXH_readLE32_align(ptr, endian, XXH_unaligned); |
260 } |
268 } |
261 |
269 |
262 static U32 XXH_readBE32(const void* ptr) |
270 static U32 XXH_readBE32(const void* ptr) |
263 { |
271 { |
264 return XXH_CPU_LITTLE_ENDIAN ? XXH_swap32(XXH_read32(ptr)) : XXH_read32(ptr); |
272 return XXH_CPU_LITTLE_ENDIAN ? XXH_swap32(XXH_read32(ptr)) : XXH_read32(ptr); |
265 } |
273 } |
266 |
274 |
267 FORCE_INLINE U64 XXH_readLE64_align(const void* ptr, XXH_endianess endian, XXH_alignment align) |
275 FORCE_INLINE_TEMPLATE U64 XXH_readLE64_align(const void* ptr, XXH_endianess endian, XXH_alignment align) |
268 { |
276 { |
269 if (align==XXH_unaligned) |
277 if (align==XXH_unaligned) |
270 return endian==XXH_littleEndian ? XXH_read64(ptr) : XXH_swap64(XXH_read64(ptr)); |
278 return endian==XXH_littleEndian ? XXH_read64(ptr) : XXH_swap64(XXH_read64(ptr)); |
271 else |
279 else |
272 return endian==XXH_littleEndian ? *(const U64*)ptr : XXH_swap64(*(const U64*)ptr); |
280 return endian==XXH_littleEndian ? *(const U64*)ptr : XXH_swap64(*(const U64*)ptr); |
273 } |
281 } |
274 |
282 |
275 FORCE_INLINE U64 XXH_readLE64(const void* ptr, XXH_endianess endian) |
283 FORCE_INLINE_TEMPLATE U64 XXH_readLE64(const void* ptr, XXH_endianess endian) |
276 { |
284 { |
277 return XXH_readLE64_align(ptr, endian, XXH_unaligned); |
285 return XXH_readLE64_align(ptr, endian, XXH_unaligned); |
278 } |
286 } |
279 |
287 |
280 static U64 XXH_readBE64(const void* ptr) |
288 static U64 XXH_readBE64(const void* ptr) |
331 seed = XXH_rotl32(seed, 13); |
339 seed = XXH_rotl32(seed, 13); |
332 seed *= PRIME32_1; |
340 seed *= PRIME32_1; |
333 return seed; |
341 return seed; |
334 } |
342 } |
335 |
343 |
336 FORCE_INLINE U32 XXH32_endian_align(const void* input, size_t len, U32 seed, XXH_endianess endian, XXH_alignment align) |
344 FORCE_INLINE_TEMPLATE U32 XXH32_endian_align(const void* input, size_t len, U32 seed, XXH_endianess endian, XXH_alignment align) |
337 { |
345 { |
338 const BYTE* p = (const BYTE*)input; |
346 const BYTE* p = (const BYTE*)input; |
339 const BYTE* bEnd = p + len; |
347 const BYTE* bEnd = p + len; |
340 U32 h32; |
348 U32 h32; |
341 #define XXH_get32bits(p) XXH_readLE32_align(p, endian, align) |
349 #define XXH_get32bits(p) XXH_readLE32_align(p, endian, align) |
431 acc ^= val; |
439 acc ^= val; |
432 acc = acc * PRIME64_1 + PRIME64_4; |
440 acc = acc * PRIME64_1 + PRIME64_4; |
433 return acc; |
441 return acc; |
434 } |
442 } |
435 |
443 |
436 FORCE_INLINE U64 XXH64_endian_align(const void* input, size_t len, U64 seed, XXH_endianess endian, XXH_alignment align) |
444 FORCE_INLINE_TEMPLATE U64 XXH64_endian_align(const void* input, size_t len, U64 seed, XXH_endianess endian, XXH_alignment align) |
437 { |
445 { |
438 const BYTE* p = (const BYTE*)input; |
446 const BYTE* p = (const BYTE*)input; |
439 const BYTE* const bEnd = p + len; |
447 const BYTE* const bEnd = p + len; |
440 U64 h64; |
448 U64 h64; |
441 #define XXH_get64bits(p) XXH_readLE64_align(p, endian, align) |
449 #define XXH_get64bits(p) XXH_readLE64_align(p, endian, align) |
580 memcpy(statePtr, &state, sizeof(state)); |
588 memcpy(statePtr, &state, sizeof(state)); |
581 return XXH_OK; |
589 return XXH_OK; |
582 } |
590 } |
583 |
591 |
584 |
592 |
585 FORCE_INLINE XXH_errorcode XXH32_update_endian (XXH32_state_t* state, const void* input, size_t len, XXH_endianess endian) |
593 FORCE_INLINE_TEMPLATE XXH_errorcode XXH32_update_endian (XXH32_state_t* state, const void* input, size_t len, XXH_endianess endian) |
586 { |
594 { |
587 const BYTE* p = (const BYTE*)input; |
595 const BYTE* p = (const BYTE*)input; |
588 const BYTE* const bEnd = p + len; |
596 const BYTE* const bEnd = p + len; |
589 |
597 |
590 #ifdef XXH_ACCEPT_NULL_INPUT_POINTER |
598 #ifdef XXH_ACCEPT_NULL_INPUT_POINTER |
650 return XXH32_update_endian(state_in, input, len, XXH_bigEndian); |
658 return XXH32_update_endian(state_in, input, len, XXH_bigEndian); |
651 } |
659 } |
652 |
660 |
653 |
661 |
654 |
662 |
655 FORCE_INLINE U32 XXH32_digest_endian (const XXH32_state_t* state, XXH_endianess endian) |
663 FORCE_INLINE_TEMPLATE U32 XXH32_digest_endian (const XXH32_state_t* state, XXH_endianess endian) |
656 { |
664 { |
657 const BYTE * p = (const BYTE*)state->mem32; |
665 const BYTE * p = (const BYTE*)state->mem32; |
658 const BYTE* const bEnd = (const BYTE*)(state->mem32) + state->memsize; |
666 const BYTE* const bEnd = (const BYTE*)(state->mem32) + state->memsize; |
659 U32 h32; |
667 U32 h32; |
660 |
668 |
700 |
708 |
701 |
709 |
702 |
710 |
703 /* **** XXH64 **** */ |
711 /* **** XXH64 **** */ |
704 |
712 |
705 FORCE_INLINE XXH_errorcode XXH64_update_endian (XXH64_state_t* state, const void* input, size_t len, XXH_endianess endian) |
713 FORCE_INLINE_TEMPLATE XXH_errorcode XXH64_update_endian (XXH64_state_t* state, const void* input, size_t len, XXH_endianess endian) |
706 { |
714 { |
707 const BYTE* p = (const BYTE*)input; |
715 const BYTE* p = (const BYTE*)input; |
708 const BYTE* const bEnd = p + len; |
716 const BYTE* const bEnd = p + len; |
709 |
717 |
710 #ifdef XXH_ACCEPT_NULL_INPUT_POINTER |
718 #ifdef XXH_ACCEPT_NULL_INPUT_POINTER |
767 return XXH64_update_endian(state_in, input, len, XXH_bigEndian); |
775 return XXH64_update_endian(state_in, input, len, XXH_bigEndian); |
768 } |
776 } |
769 |
777 |
770 |
778 |
771 |
779 |
772 FORCE_INLINE U64 XXH64_digest_endian (const XXH64_state_t* state, XXH_endianess endian) |
780 FORCE_INLINE_TEMPLATE U64 XXH64_digest_endian (const XXH64_state_t* state, XXH_endianess endian) |
773 { |
781 { |
774 const BYTE * p = (const BYTE*)state->mem64; |
782 const BYTE * p = (const BYTE*)state->mem64; |
775 const BYTE* const bEnd = (const BYTE*)state->mem64 + state->memsize; |
783 const BYTE* const bEnd = (const BYTE*)state->mem64 + state->memsize; |
776 U64 h64; |
784 U64 h64; |
777 |
785 |