X-Git-Url: http://git.archive.openwrt.org/?p=project%2Flibubox.git;a=blobdiff_plain;f=avl.h;h=46a396f2d6d55191d9e3117f563726c0d4ac8a23;hp=1c57604d2a1a853e7012a3de694bcdac3811c57c;hb=3041e8ce9b128480317b91eb97fe64914d975a59;hpb=82ce342055ec8f7a0235d46f5332014eb3f69216;ds=sidebyside diff --git a/avl.h b/avl.h index 1c57604..46a396f 100644 --- a/avl.h +++ b/avl.h @@ -82,7 +82,7 @@ struct avl_node { /** * pointer to key of node */ - void *key; + const void *key; /** * balance state of AVL tree (0,-1,+1) @@ -155,13 +155,11 @@ enum avl_find_mode { }; void EXPORT(avl_init)(struct avl_tree *, avl_tree_comp, bool, void *); -struct avl_node *EXPORT(avl_find)(struct avl_tree *, const void *); -struct avl_node *EXPORT(avl_find_greaterequal)(struct avl_tree *tree, const void *key); -struct avl_node *EXPORT(avl_find_lessequal)(struct avl_tree *tree, const void *key); +struct avl_node *EXPORT(avl_find)(const struct avl_tree *, const void *); +struct avl_node *EXPORT(avl_find_greaterequal)(const struct avl_tree *tree, const void *key); +struct avl_node *EXPORT(avl_find_lessequal)(const struct avl_tree *tree, const void *key); int EXPORT(avl_insert)(struct avl_tree *, struct avl_node *); void EXPORT(avl_delete)(struct avl_tree *, struct avl_node *); -void *EXPORT(__avl_find_element)(struct avl_tree *tree, const void *key, - size_t offset, enum avl_find_mode mode); /** * @param tree pointer to avl-tree @@ -193,6 +191,32 @@ avl_is_empty(struct avl_tree *tree) { } /** + * Internal function to support returning the element from a avl tree query + * @param tree pointer to avl tree + * @param key pointer to key + * @param offset offset of node inside the embedded struct + * @param mode mode of lookup operation (less equal, equal or greater equal) + * @param pointer to elemen, NULL if no fitting one was found + */ +static inline void * +__avl_find_element(const struct avl_tree *tree, const void *key, size_t offset, enum avl_find_mode mode) { + void *node = NULL; + + switch (mode) { + case AVL_FIND_EQUAL: + node = avl_find(tree, key); + break; + case AVL_FIND_LESSEQUAL: + node = avl_find_lessequal(tree, key); + break; + case AVL_FIND_GREATEREQUAL: + node = avl_find_greaterequal(tree, key); + break; + } + return node == NULL ? NULL : (((char *)node) - offset); +} + +/** * @param tree pointer to avl-tree * @param key pointer to key * @param element pointer to a node element