lwpa  0.1.0
LightWeight Platform Abstraction (lwpa)
View other versions:
lwpa_rbtree.h
1 /* lwpa_rbtree.h: C-language red-black tree implementation. This module is
2  * based heavily on a public-domain red-black tree implementation. The license
3  * of that implementation follows as it was when retrieved from Github on
4  * 2018-02-28.
5  *
6  ******************************************************************************
7  * Based on Julienne Walker's <http://eternallyconfuzzled.com/> rb_tree
8  * implementation.
9  *
10  * Modified by Mirek Rusin <http://github.com/mirek/rb_tree>.
11  *
12  * This is free and unencumbered software released into the public domain.
13  *
14  * Anyone is free to copy, modify, publish, use, compile, sell, or
15  * distribute this software, either in source code form or as a compiled
16  * binary, for any purpose, commercial or non-commercial, and by any
17  * means.
18  *
19  * In jurisdictions that recognize copyright laws, the author or authors
20  * of this software dedicate any and all copyright interest in the
21  * software to the public domain. We make this dedication for the benefit
22  * of the public at large and to the detriment of our heirs and
23  * successors. We intend this dedication to be an overt act of
24  * relinquishment in perpetuity of all present and future rights to this
25  * software under copyright law.
26  *
27  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
28  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
29  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
30  * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
31  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
32  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
33  * OTHER DEALINGS IN THE SOFTWARE.
34  *
35  * For more information, please refer to <http://unlicense.org/>
36  */
37 #ifndef _LWPA_RBTREE_H_
38 #define _LWPA_RBTREE_H_
39 
40 #include <stddef.h>
41 
56 #ifndef RB_ITER_MAX_HEIGHT
57 #define RB_ITER_MAX_HEIGHT 64
58 #endif
59 
60 typedef struct LwpaRbNode LwpaRbNode;
61 typedef struct LwpaRbTree LwpaRbTree;
62 
79 typedef int (*rb_tree_node_cmp_f)(const LwpaRbTree *self, const LwpaRbNode *node_a, const LwpaRbNode *node_b);
80 
91 typedef void (*rb_tree_node_f)(const LwpaRbTree *self, LwpaRbNode *node);
92 
101 typedef LwpaRbNode *(*rb_node_alloc_f)();
102 
111 typedef void (*rb_node_dealloc_f)(LwpaRbNode *node);
112 
117 {
118  int red;
120  void *value;
121 };
122 
129 {
132  size_t size;
137  void *info;
138 };
139 
145 typedef struct LwpaRbIter
146 {
151  size_t top;
152  void *info;
154 
155 #ifdef __cplusplus
156 extern "C" {
157 #endif
158 
159 int rb_tree_node_cmp_ptr_cb(const LwpaRbTree *self, const LwpaRbNode *a, const LwpaRbNode *b);
160 void rb_tree_node_dealloc_cb(const LwpaRbTree *self, LwpaRbNode *node);
161 
162 LwpaRbNode *rb_node_init(LwpaRbNode *self, void *value);
163 
165  rb_node_dealloc_f dealloc_f);
166 void *rb_tree_find(LwpaRbTree *self, void *value);
167 int rb_tree_insert(LwpaRbTree *self, void *value);
168 int rb_tree_remove(LwpaRbTree *self, void *value);
169 int rb_tree_clear(LwpaRbTree *self);
170 size_t rb_tree_size(LwpaRbTree *self);
171 
172 int rb_tree_insert_node(LwpaRbTree *self, LwpaRbNode *node);
173 int rb_tree_remove_with_cb(LwpaRbTree *self, void *value, rb_tree_node_f node_cb);
175 
176 int rb_tree_test(LwpaRbTree *self, LwpaRbNode *root);
177 
179 void *rb_iter_first(LwpaRbIter *self, LwpaRbTree *tree);
180 void *rb_iter_last(LwpaRbIter *self, LwpaRbTree *tree);
181 void *rb_iter_next(LwpaRbIter *self);
182 void *rb_iter_prev(LwpaRbIter *self);
183 
184 #ifdef __cplusplus
185 }
186 #endif
187 
190 #endif /* _LWPA_RBTREE_H_ */
#define RB_ITER_MAX_HEIGHT
The tallest allowable tree that can be iterated over.
Definition: lwpa_rbtree.h:57
int rb_tree_insert(LwpaRbTree *self, void *value)
Insert a new value into a red-black tree.
Definition: lwpa_rbtree.c:210
int rb_tree_test(LwpaRbTree *self, LwpaRbNode *root)
Test the validity of a red-black tree.
Definition: lwpa_rbtree.c:523
LwpaRbIter * rb_iter_init(LwpaRbIter *self)
Initialize a red-black tree iterator.
Definition: lwpa_rbtree.c:576
int rb_tree_remove_with_cb(LwpaRbTree *self, void *value, rb_tree_node_f node_cb)
Remove a value from a red-black tree, calling back into the application with the node and value being...
Definition: lwpa_rbtree.c:341
int rb_tree_clear(LwpaRbTree *self)
Clear all values from a red-black tree.
Definition: lwpa_rbtree.c:446
void rb_tree_node_dealloc_cb(const LwpaRbTree *self, LwpaRbNode *node)
The default node deallocation callback.
Definition: lwpa_rbtree.c:131
int rb_tree_insert_node(LwpaRbTree *self, LwpaRbNode *node)
Insert a node containing a new value into a red-black tree.
Definition: lwpa_rbtree.c:227
void * rb_iter_next(LwpaRbIter *self)
Advance a red-black tree iterator.
Definition: lwpa_rbtree.c:682
size_t rb_tree_size(LwpaRbTree *self)
Get the current number of values in a red-black tree.
Definition: lwpa_rbtree.c:505
LwpaRbNode *(* rb_node_alloc_f)()
A function type to allocate a new node.
Definition: lwpa_rbtree.h:101
void * rb_iter_prev(LwpaRbIter *self)
Reverse-advance a red-black tree iterator.
Definition: lwpa_rbtree.c:696
int rb_tree_node_cmp_ptr_cb(const LwpaRbTree *self, const LwpaRbNode *a, const LwpaRbNode *b)
The default node comparison callback.
Definition: lwpa_rbtree.c:120
void * rb_iter_first(LwpaRbIter *self, LwpaRbTree *tree)
Point a red-black tree iterator at the first value in the tree.
Definition: lwpa_rbtree.c:654
struct LwpaRbIter LwpaRbIter
A red-black tree iterator.
LwpaRbTree * rb_tree_init(LwpaRbTree *self, rb_tree_node_cmp_f cmp, rb_node_alloc_f alloc_f, rb_node_dealloc_f dealloc_f)
Initialize a red-black tree node.
Definition: lwpa_rbtree.c:149
int(* rb_tree_node_cmp_f)(const LwpaRbTree *self, const LwpaRbNode *node_a, const LwpaRbNode *node_b)
A function type that compares two nodes in a tree.
Definition: lwpa_rbtree.h:79
void(* rb_tree_node_f)(const LwpaRbTree *self, LwpaRbNode *node)
A function type to be called for each node in a tree.
Definition: lwpa_rbtree.h:91
int rb_tree_remove(LwpaRbTree *self, void *value)
Remove a value from a red-black tree.
Definition: lwpa_rbtree.c:318
void * rb_iter_last(LwpaRbIter *self, LwpaRbTree *tree)
Point a red-black tree iterator at the last value in the tree.
Definition: lwpa_rbtree.c:668
LwpaRbNode * rb_node_init(LwpaRbNode *self, void *value)
Initialize a red-black tree node.
Definition: lwpa_rbtree.c:58
int rb_tree_clear_with_cb(LwpaRbTree *self, rb_tree_node_f node_cb)
Clear all values from a red-black tree, calling back into the application for each node and value bei...
Definition: lwpa_rbtree.c:466
void * rb_tree_find(LwpaRbTree *self, void *value)
Find a value in a red-black tree.
Definition: lwpa_rbtree.c:172
void(* rb_node_dealloc_f)(LwpaRbNode *node)
A function type to deallocate a node.
Definition: lwpa_rbtree.h:111
A red-black tree iterator.
Definition: lwpa_rbtree.h:146
LwpaRbNode * path[RB_ITER_MAX_HEIGHT]
The traversal path to the current node.
Definition: lwpa_rbtree.h:150
LwpaRbNode * node
The current node.
Definition: lwpa_rbtree.h:148
size_t top
Top of the traversal stack.
Definition: lwpa_rbtree.h:151
LwpaRbTree * tree
The tree being iterated over.
Definition: lwpa_rbtree.h:147
void * info
User provided, not used by rb_iter.
Definition: lwpa_rbtree.h:152
A red-black tree node.
Definition: lwpa_rbtree.h:117
void * value
The value object represented by this node.
Definition: lwpa_rbtree.h:120
int red
The node color: red (1), black (0)
Definition: lwpa_rbtree.h:118
LwpaRbNode * link[2]
Child node links: left [0], right [1].
Definition: lwpa_rbtree.h:119
A red-black tree.
Definition: lwpa_rbtree.h:129
rb_tree_node_cmp_f cmp
A function to use for comparing two nodes.
Definition: lwpa_rbtree.h:131
LwpaRbNode * root
The root node of the tree.
Definition: lwpa_rbtree.h:130
size_t size
The current count of nodes in the tree.
Definition: lwpa_rbtree.h:132
rb_node_alloc_f alloc_f
A function to use for allocating a new node.
Definition: lwpa_rbtree.h:134
rb_node_dealloc_f dealloc_f
A function to use for deallocating a node.
Definition: lwpa_rbtree.h:136
void * info
User provided, not used by rb_tree.
Definition: lwpa_rbtree.h:137