Derive-C
Loading...
Searching...
No Matches
utils.h File Reference
#include <stdint.h>
#include <emmintrin.h>
#include <derive-c/core/math.h>
#include <derive-c/core/prelude.h>

Go to the source code of this file.

Macros

#define DC_SWISS_INITIAL_CAPACITY   256
#define _DC_SWISS_SIMD_PROBE_SIZE   sizeof(_dc_swiss_ctrl_group)
#define DC_SWISS_VAL_SENTINEL   0b11111111
#define DC_SWISS_VAL_DELETED   0b11111110
#define DC_SWISS_VAL_EMPTY   0b10000000
#define _DC_SWISS_NO_INDEX   ((size_t)-1)
#define _DC_SWISS_BITMASK_FOR_EACH(mask, idx_var)

Typedefs

typedef __m128i _dc_swiss_ctrl_group
typedef uint8_t _dc_swiss_ctrl
typedef size_t _dc_swiss_ctrl_group_index
typedef uint16_t _dc_swiss_ctrl_group_offset
typedef uint16_t _dc_swiss_ctrl_group_bitmask
typedef size_t _dc_swiss_optional_index

Enumerations

enum  _dc_swiss_rehash_action { DC_SWISS_DOUBLE_CAPACITY , DC_SWISS_CLEANUP_TOMBSONES , DC_SWISS_DO_NOTHING }

Functions

 DC_STATIC_ASSERT (DC_MATH_IS_POWER_OF_2(_DC_SWISS_SIMD_PROBE_SIZE))
DC_INTERNAL static DC_PURE bool _dc_swiss_is_present (_dc_swiss_ctrl ctrl)
static DC_INTERNAL _dc_swiss_ctrl _dc_swiss_ctrl_from_hash (size_t hash)
static DC_INTERNAL size_t dc_swiss_capacity (size_t for_items)
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_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)
static DC_INTERNAL _dc_swiss_ctrl_group_offset _dc_swiss_ctrl_group_bitmask_lowest (_dc_swiss_ctrl_group_bitmask mask)
static DC_INTERNAL _dc_swiss_ctrl_group_bitmask _dc_swiss_ctrl_group_bitmask_clear_lowest (_dc_swiss_ctrl_group_bitmask mask)
static DC_INTERNAL size_t _dc_swiss_group_index_to_slot (size_t group_start, _dc_swiss_ctrl_group_offset idx, size_t capacity)

Variables

static size_t const _dc_swiss_index_capacity = SIZE_MAX - (1 + _DC_SWISS_SIMD_PROBE_SIZE)

Macro Definition Documentation

◆ _DC_SWISS_BITMASK_FOR_EACH

#define _DC_SWISS_BITMASK_FOR_EACH ( mask,
idx_var )
Value:
for (_dc_swiss_ctrl_group_bitmask _m = (mask); _m != 0; \
_once = 1; \
_once; _once = 0)
uint16_t _dc_swiss_ctrl_group_offset
Definition utils.h:23
static DC_INTERNAL _dc_swiss_ctrl_group_offset _dc_swiss_ctrl_group_bitmask_lowest(_dc_swiss_ctrl_group_bitmask mask)
Definition utils.h:118
static DC_INTERNAL _dc_swiss_ctrl_group_bitmask _dc_swiss_ctrl_group_bitmask_clear_lowest(_dc_swiss_ctrl_group_bitmask mask)
Definition utils.h:124
uint16_t _dc_swiss_ctrl_group_bitmask
Definition utils.h:26

Definition at line 129 of file utils.h.

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), \
133 _once = 1; \
134 _once; _once = 0)

◆ _DC_SWISS_NO_INDEX

#define _DC_SWISS_NO_INDEX   ((size_t)-1)

Definition at line 98 of file utils.h.

◆ _DC_SWISS_SIMD_PROBE_SIZE

#define _DC_SWISS_SIMD_PROBE_SIZE   sizeof(_dc_swiss_ctrl_group)

Definition at line 28 of file utils.h.

◆ DC_SWISS_INITIAL_CAPACITY

#define DC_SWISS_INITIAL_CAPACITY   256

Definition at line 13 of file utils.h.

◆ DC_SWISS_VAL_DELETED

#define DC_SWISS_VAL_DELETED   0b11111110

Definition at line 36 of file utils.h.

◆ DC_SWISS_VAL_EMPTY

#define DC_SWISS_VAL_EMPTY   0b10000000

Definition at line 37 of file utils.h.

◆ DC_SWISS_VAL_SENTINEL

#define DC_SWISS_VAL_SENTINEL   0b11111111

Definition at line 35 of file utils.h.

Typedef Documentation

◆ _dc_swiss_ctrl

typedef uint8_t _dc_swiss_ctrl

Definition at line 19 of file utils.h.

◆ _dc_swiss_ctrl_group

typedef __m128i _dc_swiss_ctrl_group

Definition at line 18 of file utils.h.

◆ _dc_swiss_ctrl_group_bitmask

typedef uint16_t _dc_swiss_ctrl_group_bitmask

Definition at line 26 of file utils.h.

◆ _dc_swiss_ctrl_group_index

Definition at line 22 of file utils.h.

◆ _dc_swiss_ctrl_group_offset

typedef uint16_t _dc_swiss_ctrl_group_offset

Definition at line 23 of file utils.h.

◆ _dc_swiss_optional_index

typedef size_t _dc_swiss_optional_index

Definition at line 99 of file utils.h.

Enumeration Type Documentation

◆ _dc_swiss_rehash_action

Enumerator
DC_SWISS_DOUBLE_CAPACITY 
DC_SWISS_CLEANUP_TOMBSONES 
DC_SWISS_DO_NOTHING 

Definition at line 75 of file utils.h.

75 {
_dc_swiss_rehash_action
Definition utils.h:75
@ DC_SWISS_DO_NOTHING
Definition utils.h:78
@ DC_SWISS_DOUBLE_CAPACITY
Definition utils.h:76
@ DC_SWISS_CLEANUP_TOMBSONES
Definition utils.h:77

Function Documentation

◆ _dc_swiss_ctrl_from_hash()

DC_INTERNAL _dc_swiss_ctrl _dc_swiss_ctrl_from_hash ( size_t hash)
static

Definition at line 51 of file utils.h.

51 {
52 // Taking the top 7 bits for `H2`
53 return (uint8_t)(hash >> (sizeof(size_t) * 8 - 7));
54}

◆ _dc_swiss_ctrl_group_bitmask_clear_lowest()

DC_INTERNAL _dc_swiss_ctrl_group_bitmask _dc_swiss_ctrl_group_bitmask_clear_lowest ( _dc_swiss_ctrl_group_bitmask mask)
static

Definition at line 124 of file utils.h.

124 {
125 return mask & (mask - 1);
126}

◆ _dc_swiss_ctrl_group_bitmask_lowest()

DC_INTERNAL _dc_swiss_ctrl_group_offset _dc_swiss_ctrl_group_bitmask_lowest ( _dc_swiss_ctrl_group_bitmask mask)
static

Definition at line 118 of file utils.h.

118 {
119 DC_ASSUME(mask != 0);
120 return (_dc_swiss_ctrl_group_offset)__builtin_ctz(mask);
121}
#define DC_ASSUME(expr,...)
Definition panic.h:57

◆ _dc_swiss_ctrl_set_at()

DC_INTERNAL void _dc_swiss_ctrl_set_at ( _dc_swiss_ctrl * self,
size_t capacity,
size_t index,
_dc_swiss_ctrl val )
static

Definition at line 63 of file utils.h.

64 {
65 // JUSTIFY: Setting index past capacity
66 // ctrl[..capacity) = (empty or value)
67 // ctrl[capacity] = SENTINEL
68 // ctrl[capacity+1+i] = ctrl[i] for (_DC_SWISS_PROBE_SIZE - 1)
69 self[index] = val;
70 if (index < (_DC_SWISS_SIMD_PROBE_SIZE - 1)) {
71 self[capacity + 1 + index] = val;
72 }
73}
#define _DC_SWISS_SIMD_PROBE_SIZE
Definition utils.h:28

◆ _dc_swiss_group_index_to_slot()

DC_INTERNAL size_t _dc_swiss_group_index_to_slot ( size_t group_start,
_dc_swiss_ctrl_group_offset idx,
size_t capacity )
static

Definition at line 136 of file utils.h.

138 {
139 size_t pos = group_start + idx;
140 if (pos < capacity) {
141 return pos;
142 }
143 if (pos == capacity) {
144 // On the sentinel value
145 return _DC_SWISS_NO_INDEX;
146 }
147
148 // After the sentinel
149 return pos - capacity - 1;
150}
#define _DC_SWISS_NO_INDEX
Definition utils.h:98

◆ _dc_swiss_group_load()

DC_INTERNAL _dc_swiss_ctrl_group _dc_swiss_group_load ( const _dc_swiss_ctrl * group_ptr)
static

Definition at line 106 of file utils.h.

106 {
107 // Deal with unaligned loads - can be optimised away in release
108 return _mm_loadu_si128((const __m128i_u*)group_ptr);
109}

◆ _dc_swiss_group_match()

DC_INTERNAL _dc_swiss_ctrl_group_bitmask _dc_swiss_group_match ( _dc_swiss_ctrl_group group,
uint8_t value )
static

Definition at line 111 of file utils.h.

112 {
113 __m128i cmp = _mm_cmpeq_epi8(group, _mm_set1_epi8((char)value));
114 return (_dc_swiss_ctrl_group_bitmask)_mm_movemask_epi8(cmp);
115}

◆ _dc_swiss_heuristic_should_extend()

DC_INTERNAL _dc_swiss_rehash_action _dc_swiss_heuristic_should_extend ( size_t tombstones,
size_t count,
size_t capacity )
static

Definition at line 82 of file utils.h.

82 {
83 DC_ASSUME(capacity > 0);
84
85 const size_t max_load = capacity - (capacity / 8);
86
87 if (count + tombstones >= max_load) {
89 }
90
91 if (tombstones > (count / 2)) {
93 }
94
96}

◆ _dc_swiss_is_present()

DC_INTERNAL static DC_PURE bool _dc_swiss_is_present ( _dc_swiss_ctrl ctrl)
static

Definition at line 40 of file utils.h.

40 {
41 switch (ctrl) {
45 return false;
46 default:
47 return true;
48 }
49}
#define DC_SWISS_VAL_EMPTY
Definition utils.h:37
#define DC_SWISS_VAL_DELETED
Definition utils.h:36
#define DC_SWISS_VAL_SENTINEL
Definition utils.h:35

◆ DC_STATIC_ASSERT()

◆ dc_swiss_capacity()

DC_INTERNAL size_t dc_swiss_capacity ( size_t for_items)
static

Definition at line 56 of file utils.h.

56 {
57 if (for_items < _DC_SWISS_SIMD_PROBE_SIZE) {
59 }
60 return dc_math_next_power_of_2(for_items);
61}
static DC_INLINE DC_CONST size_t dc_math_next_power_of_2(size_t x)
Definition math.h:46

Variable Documentation

◆ _dc_swiss_index_capacity

size_t const _dc_swiss_index_capacity = SIZE_MAX - (1 + _DC_SWISS_SIMD_PROBE_SIZE)
static

Definition at line 104 of file utils.h.