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

Go to the source code of this file.

Macros

#define DC_SWISS_INITIAL_CAPACITY   256
#define DC_SWISS_SIMD_PROBE_SIZE   16
#define DC_SWISS_VAL_ID_MASK   0b01111111
#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)

Typedefs

typedef uint8_t dc_swiss_id
typedef uint8_t dc_swiss_ctrl
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))
static bool dc_swiss_is_present (dc_swiss_ctrl ctrl)
static uint8_t dc_swiss_ctrl_get_id (dc_swiss_ctrl ctrl)
static dc_swiss_id dc_swiss_id_from_hash (size_t hash)
static size_t dc_swiss_capacity (size_t for_items)
static void dc_swiss_ctrl_set_at (dc_swiss_ctrl *self, size_t capacity, size_t index, dc_swiss_ctrl val)
static dc_swiss_rehash_action dc_swiss_heuristic_should_extend (size_t tombstones, size_t count, size_t capacity)

Macro Definition Documentation

◆ DC_SWISS_INITIAL_CAPACITY

#define DC_SWISS_INITIAL_CAPACITY   256

Definition at line 7 of file utils.h.

◆ DC_SWISS_NO_INDEX

#define DC_SWISS_NO_INDEX   ((size_t)-1)

Definition at line 81 of file utils.h.

◆ DC_SWISS_SIMD_PROBE_SIZE

#define DC_SWISS_SIMD_PROBE_SIZE   16

Definition at line 8 of file utils.h.

◆ DC_SWISS_VAL_DELETED

#define DC_SWISS_VAL_DELETED   0b11111110

Definition at line 17 of file utils.h.

◆ DC_SWISS_VAL_EMPTY

#define DC_SWISS_VAL_EMPTY   0b10000000

Definition at line 18 of file utils.h.

◆ DC_SWISS_VAL_ID_MASK

#define DC_SWISS_VAL_ID_MASK   0b01111111

Definition at line 15 of file utils.h.

◆ DC_SWISS_VAL_SENTINEL

#define DC_SWISS_VAL_SENTINEL   0b11111111

Definition at line 16 of file utils.h.

Typedef Documentation

◆ dc_swiss_ctrl

typedef uint8_t dc_swiss_ctrl

Definition at line 22 of file utils.h.

◆ dc_swiss_id

typedef uint8_t dc_swiss_id

Definition at line 21 of file utils.h.

◆ dc_swiss_optional_index

typedef size_t dc_swiss_optional_index

Definition at line 82 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 59 of file utils.h.

59 {
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

Function Documentation

◆ DC_STATIC_ASSERT()

◆ dc_swiss_capacity()

size_t dc_swiss_capacity ( size_t for_items)
static

Definition at line 44 of file utils.h.

44 {
45 if (for_items < DC_SWISS_SIMD_PROBE_SIZE) {
47 }
48 return dc_math_next_power_of_2(for_items);
49}
#define DC_SWISS_SIMD_PROBE_SIZE
Definition utils.h:8
static DC_INLINE DC_CONST size_t dc_math_next_power_of_2(size_t x)
Definition math.h:48

◆ dc_swiss_ctrl_get_id()

uint8_t dc_swiss_ctrl_get_id ( dc_swiss_ctrl ctrl)
static

Definition at line 35 of file utils.h.

35 {
37 return ctrl & DC_SWISS_VAL_ID_MASK;
38}
static bool dc_swiss_is_present(dc_swiss_ctrl ctrl)
Definition utils.h:24
#define DC_SWISS_VAL_ID_MASK
Definition utils.h:15
#define DC_ASSUME(expr,...)
Definition panic.h:56

◆ dc_swiss_ctrl_set_at()

void dc_swiss_ctrl_set_at ( dc_swiss_ctrl * self,
size_t capacity,
size_t index,
dc_swiss_ctrl val )
static

Definition at line 51 of file utils.h.

52 {
53 self[index] = val;
54 if (index < (DC_SWISS_SIMD_PROBE_SIZE - 1)) {
55 self[capacity + 1 + index] = val;
56 }
57}
static size_t capacity()
Definition template.h:66

◆ dc_swiss_heuristic_should_extend()

dc_swiss_rehash_action dc_swiss_heuristic_should_extend ( size_t tombstones,
size_t count,
size_t capacity )
static

Definition at line 65 of file utils.h.

66 {
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}

◆ dc_swiss_id_from_hash()

dc_swiss_id dc_swiss_id_from_hash ( size_t hash)
static

Definition at line 40 of file utils.h.

40 {
41 return (uint8_t)(hash & DC_SWISS_VAL_ID_MASK);
42}

◆ dc_swiss_is_present()

bool dc_swiss_is_present ( dc_swiss_ctrl ctrl)
static

Definition at line 24 of file utils.h.

24 {
25 switch (ctrl) {
29 return false;
30 default:
31 return true;
32 }
33}
#define DC_SWISS_VAL_EMPTY
Definition utils.h:18
#define DC_SWISS_VAL_DELETED
Definition utils.h:17
#define DC_SWISS_VAL_SENTINEL
Definition utils.h:16