diff options
| author | Mistivia <i@mistivia.com> | 2025-11-16 15:21:36 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2025-11-16 15:21:36 +0800 |
| commit | baf05355db3bb624fcd114665980d8721b8f243b (patch) | |
| tree | 3cdc125bf66973cc1137d332409a712d820a2ae9 /rb_tree.h | |
| parent | f547737c46fdb09f47072348b0725074a7352db2 (diff) | |
delele rb_tree.h
Diffstat (limited to 'rb_tree.h')
| -rw-r--r-- | rb_tree.h | 143 |
1 files changed, 0 insertions, 143 deletions
diff --git a/rb_tree.h b/rb_tree.h deleted file mode 100644 index 7c91cea..0000000 --- a/rb_tree.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright 2002 Niels Provos <provos@citi.umich.edu> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef RB_TREE_H_ -#define RB_TREE_H_ - -#include <stdlib.h> - -#include "type_alias.h" - -#define TREE_MAP_DEF(K, V) \ - typedef struct { \ - RBNode rbnode; \ - K key; \ - V value; \ - } K##2##V##TreeMapNode; \ - typedef K##2##V##TreeMapNode *K##2##V##TreeMapIter; \ - typedef struct { \ - RBTree tree; \ - } K##2##V##TreeMap; \ - void K##2##V##TreeMap_init(K##2##V##TreeMap *self); \ - K##2##V##TreeMapIter K##2##V##TreeMap_insert(K##2##V##TreeMap *self, K key, V value); \ - K##2##V##TreeMapIter K##2##V##TreeMap_find(K##2##V##TreeMap *self, K key); \ - V* K##2##V##TreeMap_get(K##2##V##TreeMap *self, K key); \ - K##2##V##TreeMapIter K##2##V##TreeMap_next(K##2##V##TreeMap *self, K##2##V##TreeMapIter iter); \ - void K##2##V##TreeMap_remove(K##2##V##TreeMap *self, K##2##V##TreeMapIter iter); \ - K##2##V##TreeMapIter K##2##V##TreeMap_min(K##2##V##TreeMap *self); \ - K##2##V##TreeMapIter K##2##V##TreeMap_max(K##2##V##TreeMap *self); \ - K##2##V##TreeMapIter K##2##V##TreeMap_left(K##2##V##TreeMapIter iter); \ - K##2##V##TreeMapIter K##2##V##TreeMap_right(K##2##V##TreeMapIter iter); \ - K##2##V##TreeMapIter K##2##V##TreeMap_parent(K##2##V##TreeMapIter iter); \ - -#define TREE_MAP_IMPL(K, V) \ - static int K##2##V##TreeMap_cmp(void *vlhs, void *vrhs) { \ - K *lhs = vlhs, *rhs = vrhs; \ - return K##_cmp(*lhs, *rhs); \ - } \ - void K##2##V##TreeMap_init(K##2##V##TreeMap *self) { \ - self->tree.rbh_root = NULL; \ - self->tree.cmp = K##2##V##TreeMap_cmp; \ - self->tree.augment = NULL; \ - } \ - K##2##V##TreeMapIter K##2##V##TreeMap_insert(K##2##V##TreeMap *self, K key, V value) { \ - K##2##V##TreeMapNode *newnode = malloc(sizeof(K##2##V##TreeMapNode)); \ - newnode->key = key; \ - newnode->value = value; \ - return rb_tree_insert(&self->tree, newnode); \ - } \ - K##2##V##TreeMapIter K##2##V##TreeMap_find(K##2##V##TreeMap *self, K key) { \ - return rb_tree_find(&self->tree, &key); \ - } \ - V* K##2##V##TreeMap_get(K##2##V##TreeMap *self, K key) { \ - K##2##V##TreeMapIter iter = rb_tree_find(&self->tree, &key); \ - return &iter->value; \ - } \ - void K##2##V##TreeMap_remove(K##2##V##TreeMap *self, K##2##V##TreeMapIter iter) { \ - rb_tree_remove(self, iter); \ - } \ - K##2##V##TreeMapIter K##2##V##TreeMap_next(K##2##V##TreeMap *self, K##2##V##TreeMapIter iter) { \ - return rb_tree_next(&self->tree, iter); \ - } \ - K##2##V##TreeMapIter K##2##V##TreeMap_min(K##2##V##TreeMap *self) { \ - return rb_tree_min(&self->tree); \ - } \ - K##2##V##TreeMapIter K##2##V##TreeMap_max(K##2##V##TreeMap *self) { \ - return rb_tree_max(&self->tree); \ - } \ - K##2##V##TreeMapIter K##2##V##TreeMap_left(K##2##V##TreeMapIter iter) { \ - return rb_tree_left(iter); \ - } \ - K##2##V##TreeMapIter K##2##V##TreeMap_right(K##2##V##TreeMapIter iter) { \ - return rb_tree_right(iter); \ - } \ - K##2##V##TreeMapIter K##2##V##TreeMap_parent(K##2##V##TreeMapIter iter) { \ - return rb_tree_parent(iter); \ - } \ - -struct rb_node { - struct { - struct rb_node *rbe_left; - struct rb_node *rbe_right; - struct rb_node *rbe_parent; - int rbe_color; - } entry; - char content[0]; -}; -typedef struct rb_node RBNode; - -struct rb_tree { - RBNode *rbh_root; - int (*cmp)(void *k1, void *k2); - void (*augment)(void *elm); -}; -typedef struct rb_tree RBTree; - -void rb_tree_remove(RBTree *, void *iter); - -// return a iterator -void *rb_tree_insert(RBTree *, void *treenode); -void *rb_tree_find(RBTree *, void *val); -void *rb_tree_next(RBTree *, void *iter); -void *rb_tree_min(RBTree *); -void *rb_tree_max(RBTree *); -void *rb_tree_left(void *node); -void *rb_tree_right(void *node); -void *rb_tree_parent(void *node); - -void destroy_rb_tree(RBTree *, void (*freeCb)(void *)); - -TREE_MAP_DEF(String, Int); -TREE_MAP_DEF(String, String); -TREE_MAP_DEF(String, Double); -TREE_MAP_DEF(String, VoidPtr); -TREE_MAP_DEF(Int, Int); -TREE_MAP_DEF(Int, Double); -TREE_MAP_DEF(VoidPtr, Int); -TREE_MAP_DEF(VoidPtr, String); -TREE_MAP_DEF(VoidPtr, VoidPtr); - -#endif - |
