nfs-ganesha 1.4

avltree.h

Go to the documentation of this file.
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 */