libdatatypes 0.3.2
Abstract datatypes for C.
Loading...
Searching...
No Matches
rbtree.h
Go to the documentation of this file.
1/***************************************************************************
2 begin........: May 2012
3 copyright....: Sebastian Fedrau
4 email........: sebastian.fedrau@gmail.com
5 ***************************************************************************/
6
7/***************************************************************************
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License v3 as published by
10 the Free Software Foundation.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License v3 for more details.
16 ***************************************************************************/
22#ifndef RBTREE_H
23#define RBTREE_H
24
25#include <stdbool.h>
26#include <stdint.h>
27
28#include "datatypes.h"
29#include "pool.h"
30
35typedef struct _rbnode
36{
38 void *key;
40 void *value;
42 struct _rbnode *left;
44 struct _rbnode *right;
46 bool black;
47} RBNode;
48
88
90typedef struct _RBTreePair RBTreePair;
91
105
110typedef struct
111{
115 int state;
117
135
145RBTree *rbtree_new(CompareFunc compare_keys, FreeFunc free_key, FreeFunc free_value, Pool *pool);
146
156void rbtree_init(RBTree *tree, CompareFunc compare_keys, FreeFunc free_key, FreeFunc free_value, Pool *pool);
157
163void rbtree_free(RBTree *tree);
164
170void rbtree_destroy(RBTree *tree);
171
177void rbtree_clear(RBTree *tree);
178
189RBTreeInsertResult rbtree_set(RBTree *tree, void *key, void *value, bool replace_key);
190
197size_t rbtree_count(const RBTree *tree);
198
206RBTreePair *rbtree_lookup(RBTree *tree, const void *key);
207
214void *rbtree_pair_get_key(const RBTreePair *pair);
215
217#define rbtree_pair_key(p) p->node->key
218
225void *rbtree_pair_get_value(const RBTreePair *pair);
226
228#define rbtree_pair_value(p) p->node->value
229
236void rbtree_pair_set_value(RBTreePair *pair, void *value);
237
245bool rbtree_key_exists(const RBTree *tree, const void *key);
246
254bool rbtree_remove(RBTree *tree, const void *key);
255
263void rbtree_iter_init(const RBTree *tree, RBTreeIter *iter);
264
270void rbtree_iter_free(RBTreeIter *iter);
271
278void rbtree_iter_reuse(const RBTree *tree, RBTreeIter *iter);
279
286bool rbtree_iter_next(RBTreeIter *iter);
287
294void *rbtree_iter_get_key(const RBTreeIter *iter);
295
297#define rbtree_iter_key(iter) iter.sp->node->key
298
305void *rbtree_iter_get_value(const RBTreeIter *iter);
306
308#define rbtree_iter_value(iter) iter.sp->node->value
309
310#endif
311
int32_t(* CompareFunc)(const void *a, const void *b)
Definition compare.h:30
General declarations.
void(* FreeFunc)(void *p)
Definition datatypes.h:33
Allocate memory blocks of same sizes.
void * rbtree_iter_get_value(const RBTreeIter *iter)
Definition rbtree.c:1015
bool rbtree_remove(RBTree *tree, const void *key)
Definition rbtree.c:793
bool rbtree_key_exists(const RBTree *tree, const void *key)
Definition rbtree.c:622
RBTreeIterStackItem * stack
Definition rbtree.h:127
Pool * pool
Definition rbtree.h:70
void * rbtree_pair_get_key(const RBTreePair *pair)
Definition rbtree.c:582
void rbtree_pair_set_value(RBTreePair *pair, void *value)
Definition rbtree.c:608
RBNode * root
Definition rbtree.h:62
void rbtree_init(RBTree *tree, CompareFunc compare_keys, FreeFunc free_key, FreeFunc free_value, Pool *pool)
Definition rbtree.c:54
bool finished
Definition rbtree.h:133
bool black
Definition rbtree.h:46
FreeFunc free_value
Definition rbtree.h:60
void * value
Definition rbtree.h:40
RBTreePair * rbtree_lookup(RBTree *tree, const void *key)
Definition rbtree.c:564
void rbtree_iter_init(const RBTree *tree, RBTreeIter *iter)
Definition rbtree.c:870
void rbtree_clear(RBTree *tree)
Definition rbtree.c:137
RBNode ** stack
Definition rbtree.h:64
RBTreeIterStackItem * sp
Definition rbtree.h:129
struct _rbnode * left
Definition rbtree.h:42
void rbtree_destroy(RBTree *tree)
Definition rbtree.c:115
size_t rbtree_count(const RBTree *tree)
Definition rbtree.c:152
void rbtree_iter_reuse(const RBTree *tree, RBTreeIter *iter)
Definition rbtree.c:905
RBNode * node
Definition rbtree.h:85
RBTreeInsertResult rbtree_set(RBTree *tree, void *key, void *value, bool replace_key)
Definition rbtree.c:506
size_t stack_size
Definition rbtree.h:68
RBTree * rbtree_new(CompareFunc compare_keys, FreeFunc free_key, FreeFunc free_value, Pool *pool)
Definition rbtree.c:36
FreeFunc free_key
Definition rbtree.h:58
struct _rbnode * right
Definition rbtree.h:44
void * rbtree_iter_get_key(const RBTreeIter *iter)
Definition rbtree.c:1002
void * key
Definition rbtree.h:38
const RBTree * tree
Definition rbtree.h:125
bool rbtree_iter_next(RBTreeIter *iter)
Definition rbtree.c:936
RBTreeInsertResult
result of rbtree_set() method.
Definition rbtree.h:97
@ RBTREE_INSERT_RESULT_NEW
Definition rbtree.h:99
@ RBTREE_INSERT_RESULT_REPLACED
Definition rbtree.h:101
@ RBTREE_INSERT_RESULT_FAILED
Definition rbtree.h:103
struct _RBTreePair RBTreePair
Definition rbtree.h:90
FreeFunc free_value
Definition rbtree.h:83
size_t stack_size
Definition rbtree.h:131
RBNode ** sp
Definition rbtree.h:66
CompareFunc compare_keys
Definition rbtree.h:56
size_t count
Definition rbtree.h:72
void * rbtree_pair_get_value(const RBTreePair *pair)
Definition rbtree.c:595
void rbtree_iter_free(RBTreeIter *iter)
Definition rbtree.c:897
void rbtree_free(RBTree *tree)
Definition rbtree.c:124
Structure holding node data.
Definition rbtree.h:36
Red-black tree.
Definition rbtree.h:54
Structure to iterate over the elements of a RBTree.
Definition rbtree.h:123
Structure holding a node and the iteration state.
Definition rbtree.h:111
Found key-value pair.
Definition rbtree.h:81
Allocate groups of equal-sized chunks of memory.
Definition pool.h:33