Derive-C
Loading...
Searching...
No Matches
utils.h
Go to the documentation of this file.
1#pragma once
2#include <stdint.h>
3#include <stddef.h>
4
7
8static const size_t dc_ankerl_initial_items = 256;
9
10static size_t dc_ankerl_buckets_capacity(size_t for_items) {
11 if (for_items < dc_ankerl_initial_items) {
13 }
14 return dc_math_next_power_of_2(for_items);
15}
16
17static uint8_t dc_ankerl_fingerprint_from_hash(size_t hash) {
18 uint8_t fp = (uint8_t)(hash >> (sizeof(size_t) * 8U - 8U));
19 return (fp == 0) ? 1U : fp;
20}
21
22// The distance from desired (from initial hash) +1 so zeroed is empty
23typedef uint8_t dc_ankerl_dfd;
26
30
33 if (dfd == dc_ankerl_dfd_max) {
34 return dc_ankerl_dfd_max;
35 }
36 return (dc_ankerl_dfd)(dfd - 1U);
37}
38
39static dc_ankerl_dfd dc_ankerl_dfd_new(uint8_t distance) { return (dc_ankerl_dfd)(distance + 1U); }
40
41typedef struct {
42 uint8_t fingerprint;
45
46static bool dc_ankerl_mdata_present(dc_ankerl_mdata const* bucket) {
47 return bucket->dfd != dc_ankerl_dfd_none;
48}
49
50typedef struct {
53} __attribute__((packed)) dc_ankerl_index_large;
54
55uint64_t const NS(dc_ankerl_index_large, max) = ((((int64_t)1) << 47) - 1);
56
57DC_STATIC_ASSERT(sizeof(dc_ankerl_index_large) == 6);
58
59static size_t NS(dc_ankerl_index_large, get)(dc_ankerl_index_large const* index) {
60 return (size_t)index->dense_index_lo + ((size_t)index->dense_index_hi << 32);
61}
62
63static dc_ankerl_index_large NS(dc_ankerl_index_large, new)(size_t to) {
64 DC_ASSERT(to <= dc_ankerl_index_large_max, "Index too large for ankerl");
65 return (dc_ankerl_index_large){
66 .dense_index_hi = (uint16_t)(to >> 32),
67 .dense_index_lo = (uint32_t)to,
68 };
69}
70
71typedef struct {
72 uint16_t dense_index;
74
75static uint64_t const NS(dc_ankerl_index_small, max) = UINT16_MAX;
76
78
79static size_t NS(dc_ankerl_index_small, get)(dc_ankerl_index_small const* index) {
80 return (size_t)index->dense_index;
81}
82
83static dc_ankerl_index_small NS(dc_ankerl_index_small, new)(size_t to) {
84 DC_ASSERT(to <= dc_ankerl_index_small_max, "Index too large for ankerl map with small buckets");
85 return (dc_ankerl_index_small){
86 .dense_index = (uint16_t)to,
87 };
88}
static uint8_t dc_ankerl_fingerprint_from_hash(size_t hash)
Definition utils.h:17
static const size_t dc_ankerl_initial_items
Definition utils.h:8
uint8_t dc_ankerl_dfd
Definition utils.h:23
uint64_t const max
Definition utils.h:55
static bool dc_ankerl_mdata_present(dc_ankerl_mdata const *bucket)
Definition utils.h:46
static dc_ankerl_dfd dc_ankerl_dfd_new(uint8_t distance)
Definition utils.h:39
static const dc_ankerl_dfd dc_ankerl_dfd_none
Definition utils.h:24
static dc_ankerl_dfd dc_ankerl_dfd_decrement_for_backshift(dc_ankerl_dfd dfd)
Definition utils.h:31
static const dc_ankerl_dfd dc_ankerl_dfd_max
Definition utils.h:25
static dc_ankerl_dfd dc_ankerl_dfd_increment(dc_ankerl_dfd dfd)
Definition utils.h:27
static size_t dc_ankerl_buckets_capacity(size_t for_items)
Definition utils.h:10
static DC_INLINE DC_CONST size_t dc_math_next_power_of_2(size_t x)
Definition math.h:48
#define NS(pre, post)
Definition namespace.h:4
static nullalloc get()
Definition null.h:14
#define DC_ASSERT(expr,...)
Definition panic.h:36
#define DC_STATIC_ASSERT
Definition panic.h:21
uint32_t dense_index_lo
Definition utils.h:52
uint16_t dense_index_hi
Definition utils.h:51
uint16_t dense_index
Definition utils.h:72
dc_ankerl_dfd dfd
Definition utils.h:43
uint8_t fingerprint
Definition utils.h:42