// vim:fileencoding=utf-8:foldmethod=marker #ifndef SET_H #define SET_H #include "../table/table.h" #include "../../../common/misc/misc_utils.h" #include "../../../common/platform/platform.h" #ifdef WP_PLATFORM_CPP BEGIN_C_LINKAGE #endif // !WP_PLATFORM_CPP typedef WpHashTable WpHashSet; #ifdef WP_PLATFORM_CPP #define wpHashSet(TYPE, U8_STREAM_ENCODER, ITEM_EQ_TEST, CAPACITY) \ (WpHashSet{ \ WP_HASH_TABLE_DEFAULT_HASHER, \ U8_STREAM_ENCODER, \ ITEM_EQ_TEST, \ wpArrayWithCapacity(TYPE, wpMiscUtilsU64RoundUpPow2(CAPACITY), WP_ARRAY_INIT_NONE), \ NULL, \ wpArrayWithCapacity(WpHashBucket, wpMiscUtilsU64RoundUpPow2(CAPACITY), WP_ARRAY_INIT_FILLED), \ WP_HASH_TABLE_MAGIC, \ wpMiscUtilsU64RoundUpPow2(CAPACITY) - 1, \ 0.0f, \ false, \ }) #define wpHashSetCustomHasher(TYPE, HASHER, U8_STREAM_ENCODER, ITEM_EQ_TEST, CAPACITY) \ (WpHashSet{ \ HASHER, \ U8_STREAM_ENCODER, \ ITEM_EQ_TEST, \ wpArrayWithCapacity(TYPE, wpMiscUtilsU64RoundUpPow2(CAPACITY), WP_ARRAY_INIT_NONE), \ NULL, \ wpArrayWithCapacity(WpHashBucket, wpMiscUtilsU64RoundUpPow2(CAPACITY), WP_ARRAY_INIT_FILLED), \ WP_HASH_TABLE_MAGIC, \ wpMiscUtilsU64RoundUpPow2(CAPACITY) - 1, \ 0.0f, \ false, \ }) #else #define wpHashSet(TYPE, U8_STREAM_ENCODER, ITEM_EQ_TEST, CAPACITY) \ ((WpHashSet){ \ .hasher = WP_HASH_TABLE_DEFAULT_HASHER, \ .encoder = U8_STREAM_ENCODER, \ .key_eq = ITEM_EQ_TEST, \ .keys = wpArrayWithCapacity(TYPE, wpMiscUtilsU64RoundUpPow2(CAPACITY), \ WP_ARRAY_INIT_NONE), \ .buckets = wpArrayWithCapacity(WpHashBucket, wpMiscUtilsU64RoundUpPow2(CAPACITY), \ WP_ARRAY_INIT_FILLED), \ .magic = WP_HASH_TABLE_MAGIC, \ .bucket_mask = wpMiscUtilsU64RoundUpPow2(CAPACITY) - 1, \ }) #define wpHashSetCustomHasher(TYPE, HASHER, U8_STREAM_ENCODER, ITEM_EQ_TEST, CAPACITY) \ ((WpHashSet){ \ .hasher = HASHER, \ .encoder = U8_STREAM_ENCODER, \ .key_eq = ITEM_EQ_TEST, \ .keys = wpArrayWithCapacity(TYPE, wpMiscUtilsU64RoundUpPow2(CAPACITY), \ WP_ARRAY_INIT_NONE), \ .buckets = wpArrayWithCapacity(WpHashBucket, wpMiscUtilsU64RoundUpPow2(CAPACITY), \ WP_ARRAY_INIT_FILLED), \ .magic = WP_HASH_TABLE_MAGIC, \ .bucket_mask = wpMiscUtilsU64RoundUpPow2(CAPACITY) - 1, \ }) #endif #define wpHashSetAlloc(TYPE, ALLOCATOR_PTR, U8_STREAM_ENCODER, ITEM_EQ_TEST, CAPACITY) \ hashSetAlloc(ALLOCATOR_PTR, U8_STREAM_ENCODER, ITEM_EQ_TEST, CAPACITY, sizeof(TYPE)) #define wpHashSetCustomHasherAlloc(TYPE, ALLOCATOR_PTR, HASHER, U8_STREAM_ENCODER, ITEM_EQ_TEST, \ CAPACITY) \ hashSetAllocWithCustomHasher(ALLOCATOR_PTR, HASHER, U8_STREAM_ENCODER, ITEM_EQ_TEST, CAPACITY, \ sizeof(TYPE)) #define wpHashSetItems(TYPE, SET_PTR) ((TYPE *)hashTableKeys(SET_PTR, sizeof(TYPE))) #define wpHashSetCapacity(SET_PTR) hashTableCapacity(SET_PTR) #define wpHashSetCount(SET_PTR) hashTableCount(SET_PTR) #define wpHashSetItemSize(SET_PTR) hashTableKeySize(SET_PTR) #define wpHashSetFind(TYPE, SET_PTR, ITEM_PTR) hashSetFind(SET_PTR, ITEM_PTR, sizeof(TYPE)) #define wpHashSetInsertCapped(TYPE, SET_PTR, ITEM_PTR) \ hashSetInsertCapped(SET_PTR, ITEM_PTR, sizeof(TYPE)) #define wpHashSetInsertAlloc(TYPE, ALLOCATOR_PTR, SET_PTR, ITEM_PTR) \ hashSetInsertAlloc(ALLOCATOR_PTR, SET_PTR, ITEM_PTR, sizeof(TYPE)) #define wpHashSetRemove(TYPE, SET_PTR, ITEM_PTR) hashSetRemove(SET_PTR, ITEM_PTR, sizeof(TYPE)) #define wpHashSetClear(TYPE, SET_PTR) hashTableClear(SET_PTR, sizeof(TYPE), 0) #define wpHashSetDealloc(TYPE, ALLOCATOR_PTR, SET_PTR) \ hashTableDealloc(ALLOCATOR_PTR, SET_PTR, sizeof(TYPE), 0) WpHashSet hashSetAlloc(const WpAllocator *allocator, WpU8StreamEncoder encoder, WpKeyEqualTest key_eq, u64 capacity, u64 key_size); WpHashSet hashSetAllocWithCustomHasher(const WpAllocator *allocator, WpHasher hasher, WpU8StreamEncoder encoder, WpKeyEqualTest key_eq, u64 capacity, u64 key_size); WpHashLookupResult hashSetFind(WpHashSet *set, void *item, u64 item_size); void hashSetInsertCapped(WpHashSet *set, void *item, u64 item_size); void hashSetInsertAlloc(const WpAllocator *allocator, WpHashSet *set, void *item, u64 item_size); void hashSetRemove(WpHashSet *set, void *item, u64 item_size); #ifdef WP_PLATFORM_CPP END_C_LINKAGE #endif // !WP_PLATFORM_CPP #endif // !SET_H