contrib/python-zstandard/zstd/common/xxhash.c
changeset 37495 b1fb341d8a61
parent 30434 2e484bdea8c4
child 40121 73fef626dae3
equal deleted inserted replaced
37494:1ce7a55b09d1 37495:b1fb341d8a61
   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