* Alignment check
*****************************************************************/
-#define ZSTD_IS_POWER_2(a) (((a) & ((a)-1)) == 0)
+/* @return 1 if @u is a 2^n value, 0 otherwise
+ * useful to check a value is valid for alignment restrictions */
+MEM_STATIC int ZSTD_isPower2(size_t u) {
+ return (u & (u-1)) == 0;
+}
/* this test was initially positioned in mem.h,
* but this file is removed (or replaced) for linux kernel
*/
MEM_STATIC size_t ZSTD_cwksp_align(size_t size, size_t align) {
size_t const mask = align - 1;
- assert(ZSTD_IS_POWER_2(align));
+ assert(ZSTD_isPower2(align));
return (size + mask) & ~mask;
}
MEM_STATIC size_t ZSTD_cwksp_bytes_to_align_ptr(void* ptr, const size_t alignBytes) {
size_t const alignBytesMask = alignBytes - 1;
size_t const bytes = (alignBytes - ((size_t)ptr & (alignBytesMask))) & alignBytesMask;
- assert(ZSTD_IS_POWER_2(alignBytes));
+ assert(ZSTD_isPower2(alignBytes));
assert(bytes < alignBytes);
return bytes;
}
void* const start = ZSTD_cwksp_reserve_object(ws, byteSize + surplus);
if (start == NULL) return NULL;
if (surplus == 0) return start;
- assert(ZSTD_IS_POWER_2(alignment));
+ assert(ZSTD_isPower2(alignment));
return (void*)(((size_t)start + surplus) & ~mask);
}