54 lines
1.9 KiB
C
54 lines
1.9 KiB
C
#ifndef INCLUDED_FIXED_RBTREE_H
|
|||
|
|
#define INCLUDED_FIXED_RBTREE_H
|
||
|
|
|
||
|
|
#ifndef INCLUDED_OS_TYPES_H
|
||
|
|
#include <os_types.h>
|
||
|
|
#endif /*INCLUDED_OS_TYPES_H*/
|
||
|
|
|
||
|
|
#ifndef INCLUDED_POOL_H
|
||
|
|
#include <pool.h>
|
||
|
|
#endif /*INCLUDED_POOL_H*/
|
||
|
|
|
||
|
|
|
||
|
|
/* ------------------------------------------------------------------------------------------------------------------ */
|
||
|
|
/* */
|
||
|
|
|
||
|
|
typedef struct fixed_rbtree_node_s{
|
||
|
|
struct fixed_rbtree_node_s* left;
|
||
|
|
struct fixed_rbtree_node_s* right;
|
||
|
|
struct fixed_rbtree_node_s* parent;
|
||
|
|
char color;
|
||
|
|
void* key;
|
||
|
|
void* val;
|
||
|
|
}fixed_rbtree_node_t;
|
||
|
|
|
||
|
|
typedef struct {
|
||
|
|
int (*cmp)(const void* key_a, const void* key_b, void* args);
|
||
|
|
void* args;
|
||
|
|
}fixed_rbtree_ops_t;
|
||
|
|
|
||
|
|
typedef struct {
|
||
|
|
fixed_rbtree_node_t* root;
|
||
|
|
fixed_rbtree_ops_t ops;
|
||
|
|
pool_t node_pool;
|
||
|
|
}fixed_rbtree_t;
|
||
|
|
|
||
|
|
/* ------------------------------------------------------------------------------------------------------------------ */
|
||
|
|
/* */
|
||
|
|
|
||
|
|
// 初始化时指定一个 node 的对象池,最大只能容纳这些 node
|
||
|
|
void fixed_rbtree_init(fixed_rbtree_t* self, void* node_block, os_size_t node_block_size, fixed_rbtree_ops_t ops);
|
||
|
|
void fixed_rbtree_add_node_pool(fixed_rbtree_t* self, void* node_block, os_size_t node_block_size);
|
||
|
|
void fixed_rbtree_destroy(fixed_rbtree_t* self);
|
||
|
|
fixed_rbtree_node_t* fixed_rbtree_find(fixed_rbtree_t* self, const void* key);
|
||
|
|
fixed_rbtree_node_t* fixed_rbtree_custom_find(fixed_rbtree_t* self, const void* key
|
||
|
|
, fixed_rbtree_node_t* (*custom_find)(fixed_rbtree_t* tree, const void* key, fixed_rbtree_node_t* x, void* args)
|
||
|
|
, void* args);
|
||
|
|
os_err_t fixed_rbtree_insert(fixed_rbtree_t* self, void* key, void* val);
|
||
|
|
void fixed_rbtree_remove(fixed_rbtree_t* self, const void* key);
|
||
|
|
void fixed_rbtree_remove_node(fixed_rbtree_t* self, fixed_rbtree_node_t* x);
|
||
|
|
void fixed_rbtree_inorder(fixed_rbtree_t* self
|
||
|
|
, int (*apply)(fixed_rbtree_t* tree, fixed_rbtree_node_t* x, void* args), void* args);
|
||
|
|
|
||
|
|
#endif /*INCLUDED_FIXED_RBTREE_H*/
|