Skip to content

Commit 8dd9b7b

Browse files
authored
Implement RB-tree as a util (#74)
* Add basic rbtree create + destroy * Add find functions * Implement size functoin * rbtree_node_find should return the node, not element * Add naive insertion * Update insertion to be more rigorous + follow rb tree rules * Make destroy more rigorous * rbtree_recolor_node is unused * Increment node count and reject duplicates * rbtree_size should return int64_t to return -EINVAL * Make rotation consistent in convention * Implement rigorous delete function * Add generic comparator and use that everywhere * Accept a freer callback * Add some good docs for everything * Unnecessary set to 0
1 parent d68f58d commit 8dd9b7b

3 files changed

Lines changed: 501 additions & 0 deletions

File tree

kernel/include/kernel/error.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,3 +113,7 @@
113113
#define INTERNAL_ECORRQ 2601
114114
// Empty queue
115115
#define INTERNAL_EEMPQ 2602
116+
// Not found
117+
#define INTERNAL_ENOTFOUND 2603
118+
// Already exists
119+
#define INTERNAL_EEXISTS 2604

kernel/include/utils/rbtree.h

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/*
2+
* rbtree.h
3+
* Copyright (C) 2026 Aditya Kumar
4+
*
5+
* This program is free software; you can redistribute it and/or modify it under the terms of the
6+
* GNU General Public License as published by the Free Software Foundation; either version 2 of the
7+
* License, or (at your option) any later version.
8+
*
9+
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
10+
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+
* General Public License for more details.
12+
*
13+
* You should have received a copy of the GNU General Public License along with this program; if
14+
* not, see <https://www.gnu.org/licenses/>.
15+
*/
16+
17+
#pragma once
18+
19+
#include <stddef.h>
20+
#include <stdint.h>
21+
22+
typedef struct rbtree_node rbtree_node;
23+
typedef uint64_t rbtree_elem;
24+
typedef enum { RED, BLACK } rbtree_color;
25+
26+
typedef int (*rbtree_cmp) (rbtree_elem, rbtree_elem);
27+
typedef void (*rbtree_freer) (rbtree_elem);
28+
29+
struct rbtree_node {
30+
rbtree_elem value;
31+
rbtree_color color;
32+
rbtree_node *parent, *left, *right;
33+
};
34+
35+
typedef struct {
36+
rbtree_node* head;
37+
rbtree_cmp comparator;
38+
rbtree_freer freer;
39+
size_t nodes;
40+
} rbtree;
41+
42+
rbtree* rbtree_create (rbtree_cmp comparator);
43+
void rbtree_destroy (rbtree* rbt);
44+
45+
int rbtree_set_freer (rbtree* rbt, rbtree_freer freer);
46+
47+
int rbtree_insert (rbtree* rbt, rbtree_elem value);
48+
int rbtree_delete (rbtree* rbt, rbtree_elem value);
49+
int64_t rbtree_size (const rbtree* rbt);
50+
51+
int rbtree_find (rbtree* rbt, rbtree_elem value, rbtree_elem* out);
52+
int rbtree_find_atleast (rbtree* rbt, rbtree_elem value, rbtree_elem* out);
53+
int rbtree_find_atmost (rbtree* rbt, rbtree_elem value, rbtree_elem* out);

0 commit comments

Comments
 (0)