54 lines
1.5 KiB
C++
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
|
|
);
|