/* This software is licensed by the Apache License 2.0, see LICENSE file */ /* Copyright © 2022 Gregory Lirent */ #include "vnode.h" #ifndef LIBCDSB_SRC_INTERNAL_RBTREE_H #define LIBCDSB_SRC_INTERNAL_RBTREE_H typedef struct libcdsb_rbtree_node { struct libcdsb_rbtree_node* left; struct libcdsb_rbtree_node* right; struct libcdsb_rbtree_node* parent; vnode_t value; short colored; } rbnode_t; extern rbnode_t LIBCDSB_RBTREE_NODE_EMPTY[1]; extern void* libcdsb_rbtree_node_create(void* value, rbnode_t* parent, int colored, int size) Nonnull__(1,2); extern void libcdsb_rbtree_node_fixup (rbnode_t** root, rbnode_t* node) Nonnull__(1,2); extern rbnode_t* libcdsb_rbtree_node_delete(rbnode_t** root, rbnode_t* node) Nonnull__(1,2); #define rbnode_empty ((rbnode_t*)LIBCDSB_RBTREE_NODE_EMPTY) #define rbnode_create(v, p, c) ((rbnode_t*)libcdsb_rbtree_node_create(v, p, c, sizeof(rbnode_t))) #define rbnode_fixup libcdsb_rbtree_node_fixup #define rbnode_delete libcdsb_rbtree_node_delete #define rbnode_is_empty(n) ((n) == rbnode_empty) #define rbnode_is_root(n) rbnode_is_empty((n)->parent) extern void* libcdsb_rbtree_duplicate(const rbnode_t* s, void* (*node_duplicate)(void* src, void* parent, void* info), void* info) wur__ Nonnull__(1); extern int libcdsb_rbtree_compare (const rbnode_t* s0, const rbnode_t* s1, int (*node_compare)(const rbnode_t* s0, const rbnode_t* s1, void* info), void* info) pure__ wur__ Nonnull__(1,2); extern hash_t libcdsb_rbtree_hash(const void* s, hash_t (*node_hash)(const void* s, void* info), void* info) pure__ wur__ Nonnull__(1,2); extern size_t libcdsb_rbtree_size(const void* s) pure__ wur__ Nonnull__(1); extern void libcdsb_rbtree_free(void* x, void (*node_free)(void* x, void* info), void* info) Nonnull__(1); #define rbtree_duplicate libcdsb_rbtree_duplicate #define rbtree_compare libcdsb_rbtree_compare #define rbtree_hash libcdsb_rbtree_hash #define rbtree_size libcdsb_rbtree_size #define rbtree_free libcdsb_rbtree_free #endif /* LIBCDSB_SRC_INTERNAL_RBTREE_H */