2026-05-19 11:49:22 +08:00
|
|
|
#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;
|
2026-05-19 22:34:08 +08:00
|
|
|
drv_device_t* device;
|
2026-05-19 11:49:22 +08:00
|
|
|
}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*/
|