Files
2026-05-19 22:34:08 +08:00

62 lines
2.0 KiB
C

#ifndef INCLUDED_DRV_RBTREE_H
#define INCLUDED_DRV_RBTREE_H
#ifndef INCLUDED_OS_TYPES_H
#include <os_types.h>
#endif /*INCLUDED_OS_TYPES_H*/
#ifndef INCLUDED_OS_MACROS_H
#include <os_macros.h>
#endif /*INCLUDED_OS_MACROS_H*/
#ifndef INCLUDED_OS_COMPILER_H
#include <os_compiler.h>
#endif /*INCLUDED_OS_COMPILER_H*/
#ifndef INCLUDED_POOL_H
#include <pool.h>
#endif /*INCLUDED_POOL_H*/
#ifndef INCLUDED_DRV_DEVICE_H
#include <drv_device.h>
#endif /*INCLUDED_DRV_DEVICE_H*/
/* ------------------------------------------------------------------------------------------------------------------ */
/* */
typedef struct drv_rbtree_node_s{
struct drv_rbtree_node_s* left;
struct drv_rbtree_node_s* right;
struct drv_rbtree_node_s* parent;
char color;
drv_device_t* device;
}drv_rbtree_node_t;
typedef struct {
drv_rbtree_node_t* root;
pool_t node_pool;
}drv_rbtree_t;
#define DRV_RBTREE_NODE_SIZE sizeof(drv_rbtree_node_t)
/* ------------------------------------------------------------------------------------------------------------------ */
/* */
// 初始化时指定一个 node 的对象池,最大只能容纳这些 node
void drv_rbtree_init(drv_rbtree_t* self, void* node_block, os_size_t node_block_size);
void drv_rbtree_add_node_pool(drv_rbtree_t* self, void* node_block, os_size_t node_block_size);
void drv_rbtree_destroy(drv_rbtree_t* self);
drv_rbtree_node_t* drv_rbtree_find(drv_rbtree_t* self, const char* name);
drv_rbtree_node_t* drv_rbtree_custom_find(drv_rbtree_t* self, const char* name
, drv_rbtree_node_t* (*custom_find)(drv_rbtree_t* tree, const char* name, drv_rbtree_node_t* x, void* args)
, void* args);
os_err_t drv_rbtree_insert(drv_rbtree_t* self, drv_device_t* device);
void drv_rbtree_remove(drv_rbtree_t* self, const char* name);
void drv_rbtree_remove_node(drv_rbtree_t* self, drv_rbtree_node_t* x);
void drv_rbtree_inorder(drv_rbtree_t* self
, int (*apply)(drv_rbtree_t* tree, drv_rbtree_node_t* x, void* args), void* args);
#endif /*INCLUDED_DRV_RBTREE_H*/