46 lines
2.3 KiB
C
46 lines
2.3 KiB
C
/* 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 */
|