#ifndef INCLUDED_C_RBTREE_H #define INCLUDED_C_RBTREE_H #ifndef INCLUDED_C_TYPES_H #include #endif /*INCLUDED_C_TYPES_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*/