Derive-C
Loading...
Searching...
No Matches
utils.h
Go to the documentation of this file.
1#pragma once
2
3#include <stdint.h>
4#include <stddef.h>
5
8
9static const size_t dc_ankerl_initial_items = 256;
10
11DC_INTERNAL static size_t _dc_ankerl_buckets_capacity(size_t for_items) {
12 if (for_items < dc_ankerl_initial_items) {
14 }
15 return dc_math_next_power_of_2(for_items);
16}
17
18DC_INTERNAL static uint8_t _dc_ankerl_fingerprint_from_hash(size_t hash) {
19 uint8_t fp = (uint8_t)(hash >> (sizeof(size_t) * 8U - 8U));
20 return (fp == 0) ? 1U : fp;
21}
22
23// The distance from desired (from initial hash) +1 so zeroed is empty
24typedef uint8_t _dc_ankerl_dfd;
27
31
39
41 return (_dc_ankerl_dfd)(distance + 1U);
42}
43
44typedef struct {
45 uint8_t fingerprint;
48
50 return bucket->dfd != _dc_ankerl_dfd_none;
51}
52
53// Using small 32 bit buckets
58
60
62
64 size_t index) {
67 .mdata = mdata,
68 .index = (uint16_t)(index),
69 };
70}
71
74 return (size_t)bucket->index;
75}
76
77// Using large 64 bit buckets
78typedef struct {
80 uint16_t index_hi;
81 uint32_t index_lo;
83
85
86DC_STATIC_CONSTANT size_t NS(_dc_ankerl_bucket, max_index_exclusive) = (size_t)UINT32_MAX +
87 ((size_t)UINT16_MAX << 32);
88
90 size_t index) {
92 return (_dc_ankerl_bucket){
93 .mdata = mdata,
94 .index_hi = (uint16_t)(index >> 32),
95 .index_lo = (uint32_t)index,
96 };
97}
98
100 return (size_t)bucket->index_lo + ((size_t)bucket->index_hi << 32);
101}
#define DC_STATIC_CONSTANT
Definition attributes.h:23
static DC_INTERNAL size_t _dc_ankerl_buckets_capacity(size_t for_items)
Definition utils.h:11
DC_STATIC_CONSTANT size_t max_index_exclusive
Definition utils.h:61
static const size_t dc_ankerl_initial_items
Definition utils.h:9
static DC_INTERNAL _dc_ankerl_dfd _dc_ankerl_dfd_decrement_for_backshift(_dc_ankerl_dfd dfd)
Definition utils.h:32
static DC_INTERNAL uint8_t _dc_ankerl_fingerprint_from_hash(size_t hash)
Definition utils.h:18
static const _dc_ankerl_dfd _dc_ankerl_dfd_max
Definition utils.h:26
uint8_t _dc_ankerl_dfd
Definition utils.h:24
static const _dc_ankerl_dfd _dc_ankerl_dfd_none
Definition utils.h:25
static DC_INTERNAL bool _dc_ankerl_mdata_present(_dc_ankerl_mdata const *bucket)
Definition utils.h:49
static DC_INTERNAL size_t get_index(_dc_ankerl_small_bucket const *bucket)
Definition utils.h:73
static DC_INTERNAL _dc_ankerl_dfd _dc_ankerl_dfd_new(uint8_t distance)
Definition utils.h:40
static DC_INTERNAL _dc_ankerl_dfd _dc_ankerl_dfd_increment(_dc_ankerl_dfd dfd)
Definition utils.h:28
static DC_INLINE DC_CONST size_t dc_math_next_power_of_2(size_t x)
Definition math.h:46
#define NS(pre, post)
Definition namespace.h:14
#define DC_INTERNAL
Definition namespace.h:30
#define DC_ASSERT(expr,...)
Definition panic.h:37
#define DC_STATIC_ASSERT
Definition panic.h:22
#define DC_ASSUME(expr,...)
Definition panic.h:57
_dc_ankerl_mdata mdata
Definition utils.h:79
uint32_t index_lo
Definition utils.h:81
uint16_t index_hi
Definition utils.h:80
_dc_ankerl_dfd dfd
Definition utils.h:46
uint8_t fingerprint
Definition utils.h:45
_dc_ankerl_mdata mdata
Definition utils.h:55