Files
zinnia/include/zinnia/radix.h
T
2026-10-19 20:03:05 +02:00

54 lines
1.5 KiB
C++

// SPDX-License-Identifier: ISC
#pragma once
#include <zinnia/errno.h>
#include <stddef.h>
#include <stdint.h>
constexpr size_t RADIX_BITS = 6;
constexpr size_t RADIX_SLOTS = 1 << RADIX_BITS;
enum radix_tag : uint8_t {
RADIX_TAG_DIRTY,
RADIX_TAG_WRITEBACK,
RADIX_NUM_TAGS,
};
struct radix_node {
uint8_t shift;
uint8_t count;
uint8_t offset;
struct radix_node* parent;
uint64_t tags[RADIX_NUM_TAGS];
void* slots[RADIX_SLOTS];
};
struct radix_tree {
struct radix_node* root;
};
void radix_init(struct radix_tree* tree);
void radix_destroy(struct radix_tree* tree);
bool radix_empty(struct radix_tree* tree);
void* radix_lookup(struct radix_tree* tree, uint64_t index);
errno_t radix_insert(struct radix_tree* tree, uint64_t index, void* value);
void* radix_remove(struct radix_tree* tree, uint64_t index);
void** radix_slot(struct radix_tree* tree, uint64_t index);
void radix_tag_set(struct radix_tree* tree, uint64_t index, enum radix_tag tag);
void radix_tag_clear(struct radix_tree* tree, uint64_t index, enum radix_tag tag);
bool radix_tag_get(struct radix_tree* tree, uint64_t index, enum radix_tag tag);
bool radix_tagged(struct radix_tree* tree, enum radix_tag tag);
size_t radix_gang_lookup(struct radix_tree* tree, uint64_t first, size_t max, void** out, uint64_t* out_index);
size_t radix_gang_lookup_tag(
struct radix_tree* tree,
uint64_t first,
enum radix_tag tag,
size_t max,
void** out,
uint64_t* out_index
);