32 #ifndef __TOMMYTYPES_H
33 #define __TOMMYTYPES_H
75 #define tommy_cast(type, value) static_cast<type>(value)
77 #define tommy_cast(type, value) (value)
89 #if !defined(tommy_malloc) || !defined(tommy_calloc) || !defined(tommy_realloc) || !defined(tommy_free)
92 #if !defined(tommy_malloc)
93 #define tommy_malloc malloc
95 #if !defined(tommy_calloc)
96 #define tommy_calloc calloc
98 #if !defined(tommy_realloc)
99 #define tommy_realloc realloc
101 #if !defined(tommy_free)
102 #define tommy_free free
111 #if !defined(tommy_inline)
112 #if defined(_MSC_VER) || defined(__GNUC__)
113 #define tommy_inline static __inline
115 #define tommy_inline static
122 #if !defined(tommy_restrict)
123 #if __STDC_VERSION__ >= 199901L
124 #define tommy_restrict restrict
125 #elif defined(_MSC_VER) || defined(__GNUC__)
126 #define tommy_restrict __restrict
128 #define tommy_restrict
135 #if !defined(tommy_likely)
136 #if defined(__GNUC__)
137 #define tommy_likely(x) __builtin_expect(!!(x), 1)
139 #define tommy_likely(x) (x)
146 #if !defined(tommy_unlikely)
147 #if defined(__GNUC__)
148 #define tommy_unlikely(x) __builtin_expect(!!(x), 0)
150 #define tommy_unlikely(x) (x)
165 #define TOMMY_KEY_BIT (sizeof(tommy_key_t) * 8)
301 #if defined(_MSC_VER) && !defined(__cplusplus)
303 #pragma intrinsic(_BitScanReverse)
304 #pragma intrinsic(_BitScanForward)
311 #define TOMMY_ILOG2(value) ((value) == 256 ? 8 : (value) == 128 ? 7 : (value) == 64 ? 6 : (value) == 32 ? 5 : (value) == 16 ? 4 : (value) == 8 ? 3 : (value) == 4 ? 2 : (value) == 2 ? 1 : 0)
333 #if defined(_MSC_VER)
335 _BitScanReverse(&count, value);
337 #elif defined(__GNUC__)
347 return __builtin_clz(value) ^ 31;
351 static unsigned char TOMMY_DE_BRUIJN_INDEX_ILOG2[32] = {
352 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30,
353 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31
360 value |= value >> 16;
362 return TOMMY_DE_BRUIJN_INDEX_ILOG2[(
tommy_uint32_t)(value * 0x07C4ACDDU) >> 27];
376 #if defined(_MSC_VER)
378 _BitScanForward(&count, value);
380 #elif defined(__GNUC__)
381 return __builtin_ctz(value);
385 static const unsigned char TOMMY_DE_BRUIJN_INDEX_CTZ[32] = {
386 0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8,
387 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9
390 return TOMMY_DE_BRUIJN_INDEX_CTZ[(
tommy_uint32_t)(((value & - value) * 0x077CB531U)) >> 27];
409 value |= value >> 16;
421 return ((value - 0x01010101) & ~value & 0x80808080) != 0;
struct tommy_node_struct tommy_node
Data structure node.
tommy_uint_t tommy_ctz_u32(tommy_uint32_t value)
Bit scan forward or trailing zero count.
Definition: tommytypes.h:374
tommy_uint_t tommy_ilog2_u32(tommy_uint32_t value)
Bit scan reverse or integer log2.
Definition: tommytypes.h:331
tommy_uint32_t tommy_key_t
Key type used in indexed data structures to store the key or the hash value.
Definition: tommytypes.h:160
tommy_uint32_t tommy_count_t
Generic unsigned integer for counting objects.
Definition: tommytypes.h:67
uint32_t tommy_uint32_t
Generic uint32_t type.
Definition: tommytypes.h:46
ptrdiff_t tommy_ptrdiff_t
Generic ptrdiff_t type.
Definition: tommytypes.h:51
struct tommy_node_struct * next
Next node.
Definition: tommytypes.h:188
struct tommy_node_struct * prev
Previous node.
Definition: tommytypes.h:194
uintptr_t tommy_uintptr_t
Generic uintptr_t type.
Definition: tommytypes.h:48
int tommy_search_func(const void *arg, const void *obj)
Search function for elements.
Definition: tommytypes.h:278
int tommy_compare_func(const void *obj_a, const void *obj_b)
Compare function for elements.
Definition: tommytypes.h:240
int tommy_haszero_u32(tommy_uint32_t value)
Check if the specified word has a byte at 0.
Definition: tommytypes.h:419
tommy_uint32_t tommy_uint_t
Generic unsigned integer type.
Definition: tommytypes.h:60
Data structure node.
Definition: tommytypes.h:183
void tommy_foreach_func(void *obj)
Foreach function.
Definition: tommytypes.h:289
void * data
Pointer to the object containing the node.
Definition: tommytypes.h:200
size_t tommy_size_t
Generic size_t type.
Definition: tommytypes.h:50
uint64_t tommy_uint64_t
Generic uint64_t type.
Definition: tommytypes.h:47
tommy_uint32_t tommy_roundup_pow2_u32(tommy_uint32_t value)
Rounds up to the next power of 2.
Definition: tommytypes.h:399
int tommy_bool_t
Generic boolean type.
Definition: tommytypes.h:52
tommy_key_t key
Key used to store the node.
Definition: tommytypes.h:207
void tommy_foreach_arg_func(void *arg, void *obj)
Foreach function with an argument.
Definition: tommytypes.h:296