98#define SH_MAKE_PREFIX(a) CppConcat(a,_)
99#define SH_MAKE_NAME(name) SH_MAKE_NAME_(SH_MAKE_PREFIX(SH_PREFIX),name)
100#define SH_MAKE_NAME_(a,b) CppConcat(a,b)
105#define SH_TYPE SH_MAKE_NAME(hash)
106#define SH_STATUS SH_MAKE_NAME(status)
107#define SH_STATUS_EMPTY SH_MAKE_NAME(SH_EMPTY)
108#define SH_STATUS_IN_USE SH_MAKE_NAME(SH_IN_USE)
109#define SH_ITERATOR SH_MAKE_NAME(iterator)
112#define SH_CREATE SH_MAKE_NAME(create)
113#define SH_DESTROY SH_MAKE_NAME(destroy)
114#define SH_RESET SH_MAKE_NAME(reset)
115#define SH_INSERT SH_MAKE_NAME(insert)
116#define SH_INSERT_HASH SH_MAKE_NAME(insert_hash)
117#define SH_DELETE_ITEM SH_MAKE_NAME(delete_item)
118#define SH_DELETE SH_MAKE_NAME(delete)
119#define SH_LOOKUP SH_MAKE_NAME(lookup)
120#define SH_LOOKUP_HASH SH_MAKE_NAME(lookup_hash)
121#define SH_GROW SH_MAKE_NAME(grow)
122#define SH_START_ITERATE SH_MAKE_NAME(start_iterate)
123#define SH_START_ITERATE_AT SH_MAKE_NAME(start_iterate_at)
124#define SH_ITERATE SH_MAKE_NAME(iterate)
125#define SH_ALLOCATE SH_MAKE_NAME(allocate)
126#define SH_FREE SH_MAKE_NAME(free)
127#define SH_ESTIMATE_SPACE SH_MAKE_NAME(estimate_space)
128#define SH_STAT SH_MAKE_NAME(stat)
131#define SH_COMPUTE_SIZE SH_MAKE_NAME(compute_size)
132#define SH_UPDATE_PARAMETERS SH_MAKE_NAME(update_parameters)
133#define SH_NEXT SH_MAKE_NAME(next)
134#define SH_PREV SH_MAKE_NAME(prev)
135#define SH_DISTANCE_FROM_OPTIMAL SH_MAKE_NAME(distance)
136#define SH_INITIAL_BUCKET SH_MAKE_NAME(initial_bucket)
137#define SH_ENTRY_HASH SH_MAKE_NAME(entry_hash)
138#define SH_INSERT_HASH_INTERNAL SH_MAKE_NAME(insert_hash_internal)
139#define SH_LOOKUP_HASH_INTERNAL SH_MAKE_NAME(lookup_hash_internal)
166#ifndef SH_RAW_ALLOCATOR
189#ifdef SH_RAW_ALLOCATOR
259#ifndef SH_RAW_ALLOCATOR
264#define SH_MAX_SIZE (((uint64) PG_UINT32_MAX) + 1)
268#define SH_FILLFACTOR (0.9)
271#define SH_MAX_FILLFACTOR (0.98)
273#ifndef SH_GROW_MAX_DIB
274#define SH_GROW_MAX_DIB 25
277#ifndef SH_GROW_MAX_MOVE
278#define SH_GROW_MAX_MOVE 150
280#ifndef SH_GROW_MIN_FILLFACTOR
282#define SH_GROW_MIN_FILLFACTOR 0.1
286#define SH_COMPARE_KEYS(tb, ahash, akey, b) (ahash == SH_GET_HASH(tb, b) && SH_EQUAL(tb, b->SH_KEY, akey))
288#define SH_COMPARE_KEYS(tb, ahash, akey, b) (SH_EQUAL(tb, b->SH_KEY, akey))
302#define sh_error(...) pg_fatal(__VA_ARGS__)
303#define sh_log(...) pg_log_info(__VA_ARGS__)
305#define sh_error(...) elog(ERROR, __VA_ARGS__)
306#define sh_log(...) elog(LOG, __VA_ARGS__)
364 return hash &
tb->sizemask;
413#ifndef SH_USE_NONDEFAULT_ALLOCATOR
419#ifdef SH_RAW_ALLOCATOR
445#ifdef SH_RAW_ALLOCATOR
456#ifdef SH_RAW_ALLOCATOR
462 tb->private_data = private_data;
635 sh_error(
"hash table size exceeded");
721 tb->grow_threshold = 0;
771 tb->grow_threshold = 0;
1016 iter->end = iter->cur;
1034 iter->cur = at &
tb->sizemask;
1035 iter->end = iter->cur;
1060 elem = &
tb->data[iter->cur];
1063 iter->cur = (iter->cur - 1) &
tb->sizemask;
1065 if ((iter->cur &
tb->sizemask) == (iter->end &
tb->sizemask))
1099 size = (
uint64) nentries;
1102 size =
Max(size, 2);
1114 return (
size_t) space +
sizeof(
SH_TYPE);
1135 for (
i = 0;
i <
tb->size;
i++)
1142 elem = &
tb->data[
i];
1158 for (
i = 0;
i <
tb->size;
i++)
1175 if (
tb->members > 0)
1188 sh_log(
"size: " UINT64_FORMAT ", members: %u, filled: %f, total chain: %u, max chain: %u, avg chain: %f, total_collisions: %u, max_collisions: %u, avg_collisions: %f",
1200#undef SH_ELEMENT_TYPE
1207#undef SH_USE_NONDEFAULT_ALLOCATOR
1211#undef SH_MAKE_PREFIX
1215#undef SH_MAX_FILLFACTOR
1216#undef SH_GROW_MAX_DIB
1217#undef SH_GROW_MAX_MOVE
1218#undef SH_GROW_MIN_FILLFACTOR
1224#undef SH_STATUS_EMPTY
1225#undef SH_STATUS_IN_USE
1233#undef SH_INSERT_HASH
1234#undef SH_DELETE_ITEM
1237#undef SH_LOOKUP_HASH
1239#undef SH_START_ITERATE
1240#undef SH_START_ITERATE_AT
1244#undef SH_ESTIMATE_SPACE
1248#undef SH_COMPUTE_SIZE
1249#undef SH_UPDATE_PARAMETERS
1250#undef SH_COMPARE_KEYS
1251#undef SH_INITIAL_BUCKET
1254#undef SH_DISTANCE_FROM_OPTIMAL
1256#undef SH_INSERT_HASH_INTERNAL
1257#undef SH_LOOKUP_HASH_INTERNAL
#define Assert(condition)
#define SH_GET_HASH(tb, a)
void * MemoryContextAllocZero(MemoryContext context, Size size)
void pfree(void *pointer)
void * palloc0(Size size)
void * MemoryContextAllocExtended(MemoryContext context, Size size, int flags)
static uint64 pg_nextpower2_64(uint64 num)
#define SH_HASH_KEY(tb, key)
static unsigned hash(unsigned *uv, int n)
#define SH_INITIAL_BUCKET
#define SH_UPDATE_PARAMETERS
#define SH_ESTIMATE_SPACE
#define SH_DISTANCE_FROM_OPTIMAL
#define SH_LOOKUP_HASH_INTERNAL
#define SH_INSERT_HASH_INTERNAL
#define SH_START_ITERATE_AT