4 #error "swiss table requires SSE2"
13#define DC_SWISS_INITIAL_CAPACITY 256
28#define _DC_SWISS_SIMD_PROBE_SIZE sizeof(_dc_swiss_ctrl_group)
35#define DC_SWISS_VAL_SENTINEL 0b11111111
36#define DC_SWISS_VAL_DELETED 0b11111110
37#define DC_SWISS_VAL_EMPTY 0b10000000
53 return (uint8_t)(hash >> (
sizeof(size_t) * 8 - 7));
71 self[capacity + 1 + index] = val;
85 const size_t max_load = capacity - (capacity / 8);
87 if (count + tombstones >= max_load) {
91 if (tombstones > (count / 2)) {
98#define _DC_SWISS_NO_INDEX ((size_t)-1)
108 return _mm_loadu_si128((
const __m128i_u*)group_ptr);
113 __m128i cmp = _mm_cmpeq_epi8(group, _mm_set1_epi8((
char)value));
125 return mask & (mask - 1);
129#define _DC_SWISS_BITMASK_FOR_EACH(mask, idx_var) \
130 for (_dc_swiss_ctrl_group_bitmask _m = (mask); _m != 0; \
131 _m = _dc_swiss_ctrl_group_bitmask_clear_lowest(_m)) \
132 for (_dc_swiss_ctrl_group_offset idx_var = _dc_swiss_ctrl_group_bitmask_lowest(_m), \
139 size_t pos = group_start + idx;
140 if (pos < capacity) {
143 if (pos == capacity) {
149 return pos - capacity - 1;
__m128i _dc_swiss_ctrl_group
#define DC_SWISS_VAL_EMPTY
@ DC_SWISS_DOUBLE_CAPACITY
@ DC_SWISS_CLEANUP_TOMBSONES
uint16_t _dc_swiss_ctrl_group_offset
#define _DC_SWISS_SIMD_PROBE_SIZE
size_t _dc_swiss_ctrl_group_index
static DC_INTERNAL size_t _dc_swiss_group_index_to_slot(size_t group_start, _dc_swiss_ctrl_group_offset idx, size_t capacity)
static size_t const _dc_swiss_index_capacity
static DC_INTERNAL _dc_swiss_ctrl_group_offset _dc_swiss_ctrl_group_bitmask_lowest(_dc_swiss_ctrl_group_bitmask mask)
#define DC_SWISS_VAL_DELETED
static DC_INTERNAL size_t dc_swiss_capacity(size_t for_items)
DC_INTERNAL static DC_PURE bool _dc_swiss_is_present(_dc_swiss_ctrl ctrl)
static DC_INTERNAL void _dc_swiss_ctrl_set_at(_dc_swiss_ctrl *self, size_t capacity, size_t index, _dc_swiss_ctrl val)
static DC_INTERNAL _dc_swiss_ctrl_group_bitmask _dc_swiss_ctrl_group_bitmask_clear_lowest(_dc_swiss_ctrl_group_bitmask mask)
uint16_t _dc_swiss_ctrl_group_bitmask
static DC_INTERNAL _dc_swiss_rehash_action _dc_swiss_heuristic_should_extend(size_t tombstones, size_t count, size_t capacity)
static DC_INTERNAL _dc_swiss_ctrl_group _dc_swiss_group_load(const _dc_swiss_ctrl *group_ptr)
static DC_INTERNAL _dc_swiss_ctrl_group_bitmask _dc_swiss_group_match(_dc_swiss_ctrl_group group, uint8_t value)
size_t _dc_swiss_optional_index
static DC_INTERNAL _dc_swiss_ctrl _dc_swiss_ctrl_from_hash(size_t hash)
#define DC_SWISS_VAL_SENTINEL
#define _DC_SWISS_NO_INDEX
#define DC_MATH_IS_POWER_OF_2(x)
static DC_INLINE DC_CONST size_t dc_math_next_power_of_2(size_t x)
#define DC_ASSUME(expr,...)