一些基础组件
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
#ifndef INCLUDED_C_RBTREE_H
|
||||
#define INCLUDED_C_RBTREE_H
|
||||
|
||||
#ifndef INCLUDED_C_TYPES_H
|
||||
#include <c_Types.h>
|
||||
#endif /*INCLUDED_C_TYPES_H*/
|
||||
|
||||
#ifndef INCLUDED_C_ALLOCATOR_H
|
||||
#include <c_Allocator.h>
|
||||
#endif /*INCLUDED_C_ALLOCATOR_H*/
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------------------------ */
|
||||
/* */
|
||||
|
||||
// 红黑树颜色枚举
|
||||
typedef enum {
|
||||
C_RB_RED = 0,
|
||||
C_RB_BLACK = 1
|
||||
} c_RBColor_t;
|
||||
|
||||
// 泛型值复制红黑树节点控制头
|
||||
typedef struct c_RBNode_t {
|
||||
struct c_RBNode_t* parent;
|
||||
struct c_RBNode_t* left;
|
||||
struct c_RBNode_t* right;
|
||||
c_RBColor_t color;
|
||||
// 后面会紧跟一整块大小为 item_size 的物理连续内存块,直接存放真实数据值
|
||||
} c_RBNode_t;
|
||||
|
||||
typedef int (*c_RBTree_CompareFn_t)(const void* a, const void* b);
|
||||
|
||||
typedef struct {
|
||||
c_RBNode_t* root; // 树的根节点
|
||||
c_size_t item_size; // 单个元素的字节大小
|
||||
c_size_t size; // 当前树内持有的有效节点个数
|
||||
c_RBTree_CompareFn_t compare; // 关联的具体类型比较算子
|
||||
c_Allocator_t allocator; // 内部绑定的自主内存管理器
|
||||
} c_RBTree_t;
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------------------------ */
|
||||
/* */
|
||||
|
||||
c_err_t c_RBTree_Init(c_RBTree_t* self, c_size_t item_size, c_RBTree_CompareFn_t compare_fn, c_Allocator_t* allocator);
|
||||
void c_RBTree_Destroy(c_RBTree_t* self);
|
||||
|
||||
c_err_t c_RBTree_Insert(c_RBTree_t* self, const void* item);
|
||||
c_err_t c_RBTree_Remove(c_RBTree_t* self, const void* key);
|
||||
bool c_RBTree_Contains(const c_RBTree_t* self, const void* key);
|
||||
void c_RBTree_Clear(c_RBTree_t* self);
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------------------------ */
|
||||
/* */
|
||||
|
||||
C_STATIC_FORCE_INLINE
|
||||
c_size_t c_RBTree_Size(const c_RBTree_t* self) {
|
||||
if (!self) return 0;
|
||||
return self->size; // 直接返回内置计数器
|
||||
}
|
||||
|
||||
C_STATIC_FORCE_INLINE
|
||||
c_RBColor_t c_RBTree_GetColor(const c_RBNode_t* node) {
|
||||
// 根据红黑树标准性质:所有外部叶子空节点(NULL)物理上皆默认为黑色
|
||||
return (node == NULL) ? C_RB_BLACK : node->color;
|
||||
}
|
||||
|
||||
C_STATIC_FORCE_INLINE
|
||||
void c_RBTree_SetColor(c_RBNode_t* node, c_RBColor_t color) {
|
||||
if (node != NULL) {
|
||||
node->color = color; // 只有非空节点才允许修改颜色状态
|
||||
}
|
||||
}
|
||||
|
||||
#endif /*INCLUDED_C_RBTREE_H*/
|
||||
Reference in New Issue
Block a user