nfs-ganesha 1.4
|
00001 /* 00002 * libtree.h - this file is part of Libtree. 00003 * 00004 * Copyright (C) 2010 Franck Bui-Huu <fbuihuu@gmail.com> 00005 * 00006 * This library is free software; you can redistribute it and/or 00007 * modify it under the terms of the GNU Lesser General Public License 00008 * as published by the Free Software Foundation; version 2 of the 00009 * License. 00010 * 00011 * This library is distributed in the hope that it will be useful, but 00012 * WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 * Lesser General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU Lesser General Public 00017 * License along with this library; if not, write to the Free Software 00018 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 00019 * USA 00020 */ 00021 #ifndef _LIBTREE_H 00022 #define _LIBTREE_H 00023 00024 #include <stdint.h> 00025 #include <stddef.h> 00026 00027 /* 00028 * The definition has been stolen from the Linux kernel. 00029 */ 00030 #ifdef __GNUC__ 00031 # define bstree_container_of(node, type, member) ({ \ 00032 const struct bstree_node *__mptr = (node); \ 00033 (type *)( (char *)__mptr - offsetof(type,member) );}) 00034 # define rbtree_container_of(node, type, member) ({ \ 00035 const struct rbtree_node *__mptr = (node); \ 00036 (type *)( (char *)__mptr - offsetof(type,member) );}) 00037 # define avltree_container_of(node, type, member) ({ \ 00038 const struct avltree_node *__mptr = (node); \ 00039 (type *)( (char *)__mptr - offsetof(type,member) );}) 00040 # define splaytree_container_of(node, type, member) ({ \ 00041 const struct splaytree_node *__mptr = (node); \ 00042 (type *)( (char *)__mptr - offsetof(type,member) );}) 00043 #else 00044 # define bstree_container_of(node, type, member) \ 00045 ((type *)((char *)(node) - offsetof(type, member))) 00046 # define rbtree_container_of(node, type, member) \ 00047 ((type *)((char *)(node) - offsetof(type, member))) 00048 # define avltree_container_of(node, type, member) \ 00049 ((type *)((char *)(node) - offsetof(type, member))) 00050 # define splaytree_container_of(node, type, member) \ 00051 ((type *)((char *)(node) - offsetof(type, member))) 00052 #endif /* __GNUC__ */ 00053 00054 /* 00055 * Threaded binary search tree 00056 */ 00057 #ifdef UINTPTR_MAX 00058 00059 struct bstree_node { 00060 uintptr_t left, right; 00061 } __attribute__((aligned(2))); 00062 00063 #else 00064 00065 struct bstree_node { 00066 struct bstree_node *left, *right; 00067 unsigned left_is_thread:1; 00068 unsigned right_is_thread:1; 00069 }; 00070 00071 #endif /* UINTPTR_MAX */ 00072 00073 typedef int (*bstree_cmp_fn_t)(const struct bstree_node *, const struct bstree_node *); 00074 00075 struct bstree { 00076 struct bstree_node *root; 00077 bstree_cmp_fn_t cmp_fn; 00078 struct bstree_node *first, *last; 00079 uint64_t reserved[4]; 00080 }; 00081 00082 struct bstree_node *bstree_first(const struct bstree *tree); 00083 struct bstree_node *bstree_last(const struct bstree *tree); 00084 struct bstree_node *bstree_next(const struct bstree_node *node); 00085 struct bstree_node *bstree_prev(const struct bstree_node *node); 00086 00087 struct bstree_node *bstree_lookup(const struct bstree_node *key, const struct bstree *tree); 00088 struct bstree_node *bstree_insert(struct bstree_node *node, struct bstree *tree); 00089 void bstree_remove(struct bstree_node *node, struct bstree *tree); 00090 void bstree_replace(struct bstree_node *old, struct bstree_node *new, struct bstree *tree); 00091 int bstree_init(struct bstree *tree, bstree_cmp_fn_t cmp, unsigned long flags); 00092 00093 /* 00094 * Red-black tree 00095 */ 00096 enum rb_color { 00097 RB_BLACK, 00098 RB_RED, 00099 }; 00100 00101 #ifdef UINTPTR_MAX 00102 00103 struct rbtree_node { 00104 struct rbtree_node *left, *right; 00105 uintptr_t parent; 00106 } __attribute__((aligned(2))); 00107 00108 #else 00109 00110 struct rbtree_node { 00111 struct rbtree_node *left, *right; 00112 struct rbtree_node *parent; 00113 enum rb_color color; 00114 }; 00115 00116 #endif /* UINTPTR_MAX */ 00117 00118 typedef int (*rbtree_cmp_fn_t)(const struct rbtree_node *, const struct rbtree_node *); 00119 00120 struct rbtree { 00121 struct rbtree_node *root; 00122 rbtree_cmp_fn_t cmp_fn; 00123 struct rbtree_node *first, *last; 00124 uint64_t reserved[4]; 00125 }; 00126 00127 struct rbtree_node *rbtree_first(const struct rbtree *tree); 00128 struct rbtree_node *rbtree_last(const struct rbtree *tree); 00129 struct rbtree_node *rbtree_next(const struct rbtree_node *node); 00130 struct rbtree_node *rbtree_prev(const struct rbtree_node *node); 00131 00132 struct rbtree_node *rbtree_lookup(const struct rbtree_node *key, const struct rbtree *tree); 00133 struct rbtree_node *rbtree_insert(struct rbtree_node *node, struct rbtree *tree); 00134 void rbtree_remove(struct rbtree_node *node, struct rbtree *tree); 00135 void rbtree_replace(struct rbtree_node *old, struct rbtree_node *new, struct rbtree *tree); 00136 int rbtree_init(struct rbtree *tree, rbtree_cmp_fn_t cmp, unsigned long flags); 00137 00138 /* 00139 * AVL tree 00140 */ 00141 #if defined UINTPTR_MAX && UINTPTR_MAX == UINT64_MAX 00142 00143 struct avltree_node { 00144 struct avltree_node *left, *right; 00145 uintptr_t parent; /* balance factor [0:4] */ 00146 } __attribute__((aligned(8))); 00147 00148 #else 00149 00150 struct avltree_node { 00151 struct avltree_node *left, *right; 00152 struct avltree_node *parent; 00153 signed balance:3; /* balance factor [-2:+2] */ 00154 }; 00155 00156 #endif 00157 00158 typedef int (*avltree_cmp_fn_t)(const struct avltree_node *, const struct avltree_node *); 00159 00160 struct avltree { 00161 struct avltree_node *root; 00162 avltree_cmp_fn_t cmp_fn; 00163 int height; 00164 struct avltree_node *first, *last; 00165 uint64_t size; 00166 #if 0 00167 uint64_t reserved[4]; 00168 #endif 00169 }; 00170 00171 struct avltree_node *avltree_first(const struct avltree *tree); 00172 struct avltree_node *avltree_last(const struct avltree *tree); 00173 struct avltree_node *avltree_next(const struct avltree_node *node); 00174 struct avltree_node *avltree_prev(const struct avltree_node *node); 00175 uint64_t avltree_size(const struct avltree *tree); 00176 struct avltree_node *avltree_lookup(const struct avltree_node *key, const struct avltree *tree); 00177 struct avltree_node *avltree_inf(const struct avltree_node *key, 00178 const struct avltree *tree); 00179 struct avltree_node *avltree_sup(const struct avltree_node *key, 00180 const struct avltree *tree); 00181 struct avltree_node *avltree_insert(struct avltree_node *node, struct avltree *tree); 00182 void avltree_remove(struct avltree_node *node, struct avltree *tree); 00183 void avltree_replace(struct avltree_node *old, struct avltree_node *new, struct avltree *tree); 00184 int avltree_init(struct avltree *tree, avltree_cmp_fn_t cmp, unsigned long flags); 00185 00186 /* 00187 * Splay tree 00188 */ 00189 #ifdef UINTPTR_MAX 00190 00191 struct splaytree_node { 00192 uintptr_t left, right; 00193 } __attribute__((aligned(2))); 00194 00195 #else 00196 00197 struct splaytree_node { 00198 struct splaytree_node *left, *right; 00199 unsigned left_is_thread:1; 00200 unsigned right_is_thread:1; 00201 }; 00202 00203 #endif 00204 00205 typedef int (*splaytree_cmp_fn_t)(const struct splaytree_node *, const struct splaytree_node *); 00206 00207 struct splaytree { 00208 struct splaytree_node *root; 00209 struct splaytree_node *first, *last; 00210 splaytree_cmp_fn_t cmp_fn; 00211 uint64_t reserved[4]; 00212 }; 00213 00214 struct splaytree_node *splaytree_first(const struct splaytree *tree); 00215 struct splaytree_node *splaytree_last(const struct splaytree *tree); 00216 struct splaytree_node *splaytree_next(const struct splaytree_node *node); 00217 struct splaytree_node *splaytree_prev(const struct splaytree_node *node); 00218 00219 struct splaytree_node *splaytree_lookup(const struct splaytree_node *key, struct splaytree *tree); 00220 struct splaytree_node *splaytree_insert( struct splaytree_node *node, struct splaytree *tree); 00221 void splaytree_remove(struct splaytree_node *node, struct splaytree *tree); 00222 void splaytree_replace(struct splaytree_node *old, struct splaytree_node *new, struct splaytree *tree); 00223 int splaytree_init(struct splaytree *tree, splaytree_cmp_fn_t cmp, unsigned long flags); 00224 00225 #endif /* _LIBTREE_H */