Derive-C
Loading...
Searching...
No Matches
utils.h
Go to the documentation of this file.
1#pragma once
2
5#include <stdint.h>
6
7#define DC_SWISS_INITIAL_CAPACITY 256
8#define DC_SWISS_SIMD_PROBE_SIZE 16
9
10// JUSTIFY: Why power of 2?
11// - Has can be done with bitmasking, faster than modulus.
13
14// clang-format off
15#define DC_SWISS_VAL_ID_MASK 0b01111111
16#define DC_SWISS_VAL_SENTINEL 0b11111111
17#define DC_SWISS_VAL_DELETED 0b11111110
18#define DC_SWISS_VAL_EMPTY 0b10000000
19// clang-format on
20
21typedef uint8_t dc_swiss_id;
22typedef uint8_t dc_swiss_ctrl;
23
25 switch (ctrl) {
29 return false;
30 default:
31 return true;
32 }
33}
34
35static uint8_t dc_swiss_ctrl_get_id(dc_swiss_ctrl ctrl) {
37 return ctrl & DC_SWISS_VAL_ID_MASK;
38}
39
41 return (uint8_t)(hash & DC_SWISS_VAL_ID_MASK);
42}
43
44static size_t dc_swiss_capacity(size_t for_items) {
45 if (for_items < DC_SWISS_SIMD_PROBE_SIZE) {
47 }
48 return dc_math_next_power_of_2(for_items);
49}
50
51static void dc_swiss_ctrl_set_at(dc_swiss_ctrl* self, size_t capacity, size_t index,
52 dc_swiss_ctrl val) {
53 self[index] = val;
54 if (index < (DC_SWISS_SIMD_PROBE_SIZE - 1)) {
55 self[capacity + 1 + index] = val;
56 }
57}
58
64
65static dc_swiss_rehash_action dc_swiss_heuristic_should_extend(size_t tombstones, size_t count,
66 size_t capacity) {
68
69 const size_t max_load = capacity - (capacity / 8);
70 if (count >= max_load) {
72 }
73
74 if (tombstones > (count / 2)) {
76 }
77
79}
80
81#define DC_SWISS_NO_INDEX ((size_t)-1)
static size_t capacity()
Definition template.h:66
static void dc_swiss_ctrl_set_at(dc_swiss_ctrl *self, size_t capacity, size_t index, dc_swiss_ctrl val)
Definition utils.h:51
static size_t dc_swiss_capacity(size_t for_items)
Definition utils.h:44
dc_swiss_rehash_action
Definition utils.h:59
@ DC_SWISS_DO_NOTHING
Definition utils.h:62
@ DC_SWISS_DOUBLE_CAPACITY
Definition utils.h:60
@ DC_SWISS_CLEANUP_TOMBSONES
Definition utils.h:61
static bool dc_swiss_is_present(dc_swiss_ctrl ctrl)
Definition utils.h:24
#define DC_SWISS_VAL_EMPTY
Definition utils.h:18
static dc_swiss_id dc_swiss_id_from_hash(size_t hash)
Definition utils.h:40
uint8_t dc_swiss_id
Definition utils.h:21
#define DC_SWISS_SIMD_PROBE_SIZE
Definition utils.h:8
static uint8_t dc_swiss_ctrl_get_id(dc_swiss_ctrl ctrl)
Definition utils.h:35
#define DC_SWISS_VAL_ID_MASK
Definition utils.h:15
size_t dc_swiss_optional_index
Definition utils.h:82
#define DC_SWISS_VAL_DELETED
Definition utils.h:17
uint8_t dc_swiss_ctrl
Definition utils.h:22
static dc_swiss_rehash_action dc_swiss_heuristic_should_extend(size_t tombstones, size_t count, size_t capacity)
Definition utils.h:65
#define DC_SWISS_VAL_SENTINEL
Definition utils.h:16
#define DC_MATH_IS_POWER_OF_2(x)
Definition math.h:12
static DC_INLINE DC_CONST size_t dc_math_next_power_of_2(size_t x)
Definition math.h:48
#define DC_STATIC_ASSERT
Definition panic.h:21
#define DC_ASSUME(expr,...)
Definition panic.h:56