1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275
|
#ifndef BTREE_H
#define BTREE_H
#include "kerncompat.h"
/*
* B+Tree node format:
* [key0, key1, ..., keyN] [val0, val1, ..., valN]
* Each key is an array of unsigned longs, head->no_longs in total.
* Total number of keys and vals (N) is head->no_pairs.
*/
struct btree_head {
unsigned long *node;
int height;
};
struct btree_geo {
int keylen;
int no_pairs;
};
extern struct btree_geo btree_geo32;
extern struct btree_geo btree_geo64;
extern struct btree_geo btree_geo128;
struct btree_headl { struct btree_head h; };
struct btree_head32 { struct btree_head h; };
struct btree_head64 { struct btree_head h; };
struct btree_head128 { struct btree_head h; };
/*
* These couple of functions are all there is to it. The rest of this header
* consists only of wrappers that try to add some typesafety, make the code
* a little self-documenting and generally be nice to people.
*/
void btree_free(void *element, void *pool_data);
void btree_init(struct btree_head *head);
void *btree_lookup(struct btree_head *head, struct btree_geo *geo,
unsigned long *key);
int btree_insert(struct btree_head *head, struct btree_geo *geo,
unsigned long *key, void *val);
void *btree_remove(struct btree_head *head, struct btree_geo *geo,
unsigned long *key);
int btree_merge(struct btree_head *target, struct btree_head *victim,
struct btree_geo *geo, unsigned long *duplicate);
unsigned long *btree_last(struct btree_head *head, struct btree_geo *geo);
size_t btree_visitor(struct btree_head *head, struct btree_geo *geo,
long opaque,
void (*func)(void *elem, long opaque, unsigned long *key,
size_t index, void *func2), void *func2);
size_t btree_grim_visitor(struct btree_head *head, struct btree_geo *geo,
long opaque,
void (*func)(void *elem, long opaque, unsigned long *key,
size_t index, void *func2), void *func2);
/* key is unsigned long */
static inline void btree_initl(struct btree_headl *head)
{
btree_init(&head->h);
}
static inline void *btree_lookupl(struct btree_headl *head, unsigned long key)
{
return btree_lookup(&head->h, &btree_geo32, &key);
}
static inline int btree_insertl(struct btree_headl *head, unsigned long key,
void *val)
{
return btree_insert(&head->h, &btree_geo32, &key, val);
}
static inline void *btree_removel(struct btree_headl *head, unsigned long key)
{
return btree_remove(&head->h, &btree_geo32, &key);
}
static inline int btree_mergel(struct btree_headl *target,
struct btree_headl *victim)
{
unsigned long scratch;
return btree_merge(&target->h, &victim->h, &btree_geo32, &scratch);
}
void visitorl(void *elem, long opaque, unsigned long *key, size_t index,
void *__func);
typedef void (*visitorl_t)(void *elem, long opaque, unsigned long key,
size_t index);
static inline size_t btree_visitorl(struct btree_headl *head, long opaque,
visitorl_t func2)
{
return btree_visitor(&head->h, &btree_geo32, opaque, visitorl, func2);
}
static inline size_t btree_grim_visitorl(struct btree_headl *head, long opaque,
visitorl_t func2)
{
return btree_grim_visitor(&head->h, &btree_geo32, opaque, visitorl, func2);
}
/* key is u32 */
static inline void btree_init32(struct btree_head32 *head)
{
btree_init(&head->h);
}
static inline void *btree_lookup32(struct btree_head32 *head, u32 key)
{
return btree_lookup(&head->h, &btree_geo32, (unsigned long *)&key);
}
static inline int btree_insert32(struct btree_head32 *head, u32 key,
void *val)
{
return btree_insert(&head->h, &btree_geo32, (unsigned long *)&key, val);
}
static inline void *btree_remove32(struct btree_head32 *head, u32 key)
{
return btree_remove(&head->h, &btree_geo32, (unsigned long *)&key);
}
static inline int btree_merge32(struct btree_head32 *target,
struct btree_head32 *victim)
{
unsigned long scratch;
return btree_merge(&target->h, &victim->h, &btree_geo32, &scratch);
}
void visitor32(void *elem, long opaque, unsigned long *__key, size_t index,
void *__func);
typedef void (*visitor32_t)(void *elem, long opaque, u32 key, size_t index);
static inline size_t btree_visitor32(struct btree_head32 *head, long opaque,
visitor32_t func2)
{
return btree_visitor(&head->h, &btree_geo32, opaque, visitor32, func2);
}
static inline size_t btree_grim_visitor32(struct btree_head32 *head, long opaque,
visitor32_t func2)
{
return btree_grim_visitor(&head->h, &btree_geo32, opaque, visitor32, func2);
}
/* key is u64 */
static inline void btree_init64(struct btree_head64 *head)
{
btree_init(&head->h);
}
static inline void *btree_lookup64(struct btree_head64 *head, u64 key)
{
return btree_lookup(&head->h, &btree_geo64, (unsigned long *)&key);
}
static inline int btree_insert64(struct btree_head64 *head, u64 key,
void *val)
{
return btree_insert(&head->h, &btree_geo64, (unsigned long *)&key, val);
}
static inline void *btree_remove64(struct btree_head64 *head, u64 key)
{
return btree_remove(&head->h, &btree_geo64, (unsigned long *)&key);
}
static inline u64 btree_last64(struct btree_head64 *head)
{
u64 *key;
key = (u64 *)btree_last(&head->h, &btree_geo64);
if (key)
return *key;
else
return 0;
}
static inline int btree_merge64(struct btree_head64 *target,
struct btree_head64 *victim)
{
u64 scratch;
return btree_merge(&target->h, &victim->h, &btree_geo64,
(unsigned long *)&scratch);
}
void visitor64(void *elem, long opaque, unsigned long *__key, size_t index,
void *__func);
typedef void (*visitor64_t)(void *elem, long opaque, u64 key, size_t index);
static inline size_t btree_visitor64(struct btree_head64 *head, long opaque,
visitor64_t func2)
{
return btree_visitor(&head->h, &btree_geo64, opaque, visitor64, func2);
}
static inline size_t btree_grim_visitor64(struct btree_head64 *head, long opaque,
visitor64_t func2)
{
return btree_grim_visitor(&head->h, &btree_geo64, opaque, visitor64, func2);
}
/* key is 128bit (two u64) */
static inline void btree_init128(struct btree_head128 *head)
{
btree_init(&head->h);
}
static inline void *btree_lookup128(struct btree_head128 *head, u64 k1, u64 k2)
{
u64 key[2] = {k1, k2};
return btree_lookup(&head->h, &btree_geo128, (unsigned long *)&key);
}
static inline int btree_insert128(struct btree_head128 *head, u64 k1, u64 k2,
void *val)
{
u64 key[2] = {k1, k2};
return btree_insert(&head->h, &btree_geo128, (unsigned long *)&key, val);
}
static inline void *btree_remove128(struct btree_head128 *head, u64 k1, u64 k2)
{
u64 key[2] = {k1, k2};
return btree_remove(&head->h, &btree_geo128, (unsigned long *)&key);
}
static inline void btree_last128(struct btree_head128 *head, u64 *k1, u64 *k2)
{
u64 *key = (u64 *)btree_last(&head->h, &btree_geo128);
if (key) {
*k1 = key[0];
*k2 = key[1];
} else {
*k1 = 0;
*k2 = 0;
}
}
static inline int btree_merge128(struct btree_head128 *target,
struct btree_head128 *victim)
{
u64 scratch[2];
return btree_merge(&target->h, &victim->h, &btree_geo128,
(unsigned long *)scratch);
}
void visitor128(void *elem, long opaque, unsigned long *__key, size_t index,
void *__func);
typedef void (*visitor128_t)(void *elem, long opaque, u64 key1, u64 key2,
size_t index);
static inline size_t btree_visitor128(struct btree_head128 *head, long opaque,
visitor128_t func2)
{
return btree_visitor(&head->h, &btree_geo128, opaque, visitor128, func2);
}
static inline size_t btree_grim_visitor128(struct btree_head128 *head, long opaque,
visitor128_t func2)
{
return btree_grim_visitor(&head->h, &btree_geo128, opaque, visitor128, func2);
}
#endif
|