49 lines
1.4 KiB
C
49 lines
1.4 KiB
C
#ifndef INCLUDED_C_RBTREE_H
|
|||
|
|
#define INCLUDED_C_RBTREE_H
|
||
|
|
|
||
|
|
#ifndef INCLUDED_C_BASE_H
|
||
|
|
#include <c_Base.h>
|
||
|
|
#endif /*INCLUDED_C_BASE_H*/
|
||
|
|
|
||
|
|
/* ------------------------------------------------------------------------------------------------------------------ */
|
||
|
|
/* */
|
||
|
|
|
||
|
|
typedef enum {
|
||
|
|
C_RBTREE_RED,
|
||
|
|
C_RBTREE_BLACK
|
||
|
|
} c_RBTreeColor_t;
|
||
|
|
|
||
|
|
typedef struct c_RBTreeNode_t {
|
||
|
|
void* data;
|
||
|
|
c_RBTreeColor_t color;
|
||
|
|
struct c_RBTreeNode_t* left;
|
||
|
|
struct c_RBTreeNode_t* right;
|
||
|
|
struct c_RBTreeNode_t* parent;
|
||
|
|
} c_RBTreeNode_t;
|
||
|
|
|
||
|
|
// User Comparison Callback Signature: Returns <0 if a < b, 0 if a == b, >0 if a > b
|
||
|
|
typedef int (*c_RBTree_Compare_f)(const void* a, const void* b);
|
||
|
|
|
||
|
|
// User Visitor Callback Signature for Traversals
|
||
|
|
typedef void (*c_RBTree_Visit_f)(void* data, void* cl);
|
||
|
|
|
||
|
|
typedef struct {
|
||
|
|
c_RBTreeNode_t* root;
|
||
|
|
c_RBTreeNode_t* nil; // Sentinal node representing leaf nodes to simplify rotation math
|
||
|
|
int obj_size;
|
||
|
|
c_size_t size;
|
||
|
|
c_RBTree_Compare_f compare;
|
||
|
|
} c_RBTree_t;
|
||
|
|
|
||
|
|
c_err_t c_RBTree_Init(c_RBTree_t* self, int obj_size, c_RBTree_Compare_f compare);
|
||
|
|
void c_RBTree_Destroy(c_RBTree_t* self);
|
||
|
|
|
||
|
|
c_err_t c_RBTree_Insert(c_RBTree_t* self, void* obj);
|
||
|
|
c_err_t c_RBTree_Remove(c_RBTree_t* self, void* obj);
|
||
|
|
void* c_RBTree_Find(c_RBTree_t* self, const void* key_target);
|
||
|
|
|
||
|
|
void c_RBTree_InOrder(c_RBTree_t* self, c_RBTree_Visit_f visit, void* cl);
|
||
|
|
|
||
|
|
|
||
|
|
#endif /*INCLUDED_C_RBTREE_H*/
|