2025-08-10 01:34:16 +02:00

65 lines
1.3 KiB
C

#ifndef NodeTree_h_cfEUS0RiTiwS20ayW10wHn
#define NodeTree_h_cfEUS0RiTiwS20ayW10wHn
#include <common/nodes/Node.h>
#include <linux/rbtree.h>
struct NodeTree;
typedef struct NodeTree NodeTree;
struct NodeTreeIter;
typedef struct NodeTreeIter NodeTreeIter;
extern void NodeTree_init(NodeTree* this);
extern void NodeTree_uninit(NodeTree* this);
extern Node* NodeTree_find(NodeTree* this, NumNodeID nodeNumID);
extern Node* NodeTree_getNext(NodeTree* this, Node* node);
extern bool NodeTree_insert(NodeTree* this, NumNodeID nodeNumID, Node* node);
extern bool NodeTree_erase(NodeTree* this, NumNodeID nodeNumID);
static inline void NodeTreeIter_init(NodeTreeIter* this, NodeTree* tree);
static inline void NodeTreeIter_next(NodeTreeIter* this);
static inline Node* NodeTreeIter_value(NodeTreeIter* this);
static inline bool NodeTreeIter_end(NodeTreeIter* this);
struct NodeTree
{
struct rb_root nodes;
unsigned size;
};
struct NodeTreeIter
{
struct rb_node* value;
};
void NodeTreeIter_init(NodeTreeIter* this, NodeTree* tree)
{
this->value = rb_first(&tree->nodes);
}
void NodeTreeIter_next(NodeTreeIter* this)
{
this->value = rb_next(this->value);
}
Node* NodeTreeIter_value(NodeTreeIter* this)
{
return rb_entry(this->value, Node, _nodeTree.rbTreeElement);
}
bool NodeTreeIter_end(NodeTreeIter* this)
{
return this->value == NULL;
}
#endif