2009-05-29 13:03:19 +00:00
|
|
|
#ifndef _LIGHTTPD_RADIX_H_
|
|
|
|
#define _LIGHTTPD_RADIX_H_
|
|
|
|
|
2009-07-07 16:45:47 +00:00
|
|
|
#include <lighttpd/settings.h>
|
|
|
|
|
2009-05-29 13:03:19 +00:00
|
|
|
/*
|
|
|
|
* Radix tree with 32bit key, lookup, insert and remove in O(32).
|
|
|
|
* This is where the bit magic happens.
|
|
|
|
*/
|
|
|
|
|
2009-07-08 19:06:07 +00:00
|
|
|
typedef struct liRadixNode32 liRadixNode32;
|
|
|
|
struct liRadixNode32 {
|
2009-05-29 13:03:19 +00:00
|
|
|
guint32 key;
|
|
|
|
guint32 mask;
|
|
|
|
gpointer data;
|
2009-07-08 19:06:07 +00:00
|
|
|
liRadixNode32 *parent;
|
|
|
|
liRadixNode32 *right;
|
|
|
|
liRadixNode32 *left;
|
2009-05-29 13:03:19 +00:00
|
|
|
};
|
|
|
|
|
2009-07-08 19:06:07 +00:00
|
|
|
typedef struct liRadixTree32 liRadixTree32;
|
|
|
|
struct liRadixTree32 {
|
|
|
|
liRadixNode32 **root;
|
2009-05-29 13:03:19 +00:00
|
|
|
guint32 size;
|
|
|
|
guint32 root_width;
|
|
|
|
guint32 root_mask;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2009-07-09 20:17:24 +00:00
|
|
|
LI_API liRadixTree32 *li_radixtree32_new(guint32 root_width);
|
|
|
|
LI_API guint32 li_radixtree32_free(liRadixTree32 *tree);
|
2009-05-29 13:03:19 +00:00
|
|
|
|
2009-07-09 20:17:24 +00:00
|
|
|
LI_API void li_radixtree32_insert(liRadixTree32 *tree, guint32 key, guint32 mask, gpointer data);
|
|
|
|
LI_API gboolean li_radixtree32_remove(liRadixTree32 *tree, guint32 key, guint32 mask);
|
2009-05-29 13:03:19 +00:00
|
|
|
|
|
|
|
/* lookup tree node (best match) */
|
2009-07-09 20:17:24 +00:00
|
|
|
LI_API liRadixNode32 *li_radixtree32_lookup_node(liRadixTree32 *tree, guint32 key);
|
2009-05-29 13:03:19 +00:00
|
|
|
|
|
|
|
/* lookup data pointer (best match) */
|
2009-07-09 20:17:24 +00:00
|
|
|
LI_API gpointer li_radixtree32_lookup(liRadixTree32 *tree, guint32 key);
|
2009-05-29 13:03:19 +00:00
|
|
|
/* lookup data pointer (exact match) */
|
2009-07-09 20:17:24 +00:00
|
|
|
LI_API gpointer li_radixtree32_lookup_exact(liRadixTree32 *tree, guint32 key);
|
2009-05-29 13:03:19 +00:00
|
|
|
|
|
|
|
/*
|
2009-07-08 19:06:07 +00:00
|
|
|
typedef struct liRadixNode128 liRadixNode128;
|
|
|
|
struct liRadixNode128 {
|
2009-05-29 13:03:19 +00:00
|
|
|
guint32 key[4];
|
|
|
|
guint32 mask[3];
|
|
|
|
gpointer data;
|
2009-07-08 19:06:07 +00:00
|
|
|
liRadixNode128 *parent;
|
|
|
|
liRadixNode128 *right;
|
|
|
|
liRadixNode128 *left;
|
2009-05-29 13:03:19 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2009-07-08 19:06:07 +00:00
|
|
|
struct liRadixTree128 {
|
|
|
|
liRadixNode128 **root;
|
2009-05-29 13:03:19 +00:00
|
|
|
guint64 size;
|
|
|
|
guint32 root_width;
|
|
|
|
guint32 root_mask;
|
|
|
|
}
|
|
|
|
|
2009-07-08 19:06:07 +00:00
|
|
|
LI_api liRadixTree128 *radixtree128_new(guint32 root_width);
|
2009-07-09 20:17:24 +00:00
|
|
|
LI_API guint li_radixtree128_free(liRadixTree128 *tree);
|
2009-05-29 13:03:19 +00:00
|
|
|
|
2009-07-09 20:17:24 +00:00
|
|
|
LI_API void li_radixtree128_insert(liRadixTree128 *tree, guint32 *key, guint32 *mask, gpointer data);
|
|
|
|
LI_API gboolean li_radixtree128_remove(liRadixTree128 *tree, guint32 *key, guint32 *mask);
|
|
|
|
LI_API gpointer li_radixtree128_lookup(liRadixTree128 *tree, guint32 *key);
|
2009-05-29 13:03:19 +00:00
|
|
|
*/
|
|
|
|
#endif
|