ucx/avl.h

Fri, 26 Feb 2016 16:33:04 +0100

author
Mike Becker <universe@uap-core.de>
date
Fri, 26 Feb 2016 16:33:04 +0100
changeset 218
b20d6088795c
parent 205
54a7ceb9151f
child 225
a1a068c2c4ef
permissions
-rw-r--r--

fixed further usages of SIZE_MAX

     1 /*
     2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
     3  *
     4  * Copyright 2015 Olaf Wintermann. All rights reserved.
     5  *
     6  * Redistribution and use in source and binary forms, with or without
     7  * modification, are permitted provided that the following conditions are met:
     8  *
     9  *   1. Redistributions of source code must retain the above copyright
    10  *      notice, this list of conditions and the following disclaimer.
    11  *
    12  *   2. Redistributions in binary form must reproduce the above copyright
    13  *      notice, this list of conditions and the following disclaimer in the
    14  *      documentation and/or other materials provided with the distribution.
    15  *
    16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    19  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
    20  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    26  * POSSIBILITY OF SUCH DAMAGE.
    27  */
    30 /**
    31  * @file avl.h
    32  * 
    33  * AVL tree implementation.
    34  * 
    35  * This binary search tree implementation allows average O(1) insertion and
    36  * removal of elements (excluding binary search time).
    37  * 
    38  * @author Mike Becker
    39  * @author Olaf Wintermann
    40  */
    42 #ifndef UCX_AVL_H
    43 #define UCX_AVL_H
    45 #include "ucx.h"
    46 #include "allocator.h"
    47 #include <inttypes.h>
    49 #ifdef	__cplusplus
    50 extern "C" {
    51 #endif
    53 /**
    54  * UCX AVL Node type.
    55  * 
    56  * @see UcxAVLNode
    57  */
    58 typedef struct UcxAVLNode UcxAVLNode;
    60 /**
    61  * UCX AVL Node.
    62  */
    63 struct UcxAVLNode {
    64     /**
    65      * The key for this node.
    66      */
    67     intptr_t key;
    68     /**
    69      * Data contained by this node.
    70      */
    71     void *value;
    72     /**
    73      * The height of this (sub)-tree.
    74      */
    75     size_t height;
    76     /**
    77      * Parent node.
    78      */
    79     UcxAVLNode *parent;
    80     /**
    81      * Root node of left subtree.
    82      */
    83     UcxAVLNode *left;
    84     /**
    85      * Root node of right subtree.
    86      */
    87     UcxAVLNode *right;
    88 };
    90 /**
    91  * UCX AVL Tree.
    92  */
    93 typedef struct {
    94     /**
    95      * The UcxAllocator that shall be used to manage the memory for node data.
    96      */
    97     UcxAllocator *allocator;
    98     /**
    99      * Root node of the tree.
   100      */
   101     UcxAVLNode *root;
   102     /**
   103      * Compare function that shall be used to compare the UcxAVLNode keys.
   104      * @see UcxAVLNode.key
   105      */
   106     cmp_func cmpfunc;
   107     /**
   108      * Custom user data.
   109      * This data will also be provided to the cmpfunc.
   110      */
   111     void *userdata;
   112 } UcxAVLTree;
   114 /**
   115  * Initializes a new UcxAVLTree with a default allocator.
   116  * 
   117  * @param cmpfunc the compare function that shall be used
   118  * @return a new UcxAVLTree object
   119  * @see ucx_avl_new_a()
   120  */
   121 UcxAVLTree *ucx_avl_new(cmp_func cmpfunc);
   123 /**
   124  * Initializes a new UcxAVLTree with the specified allocator.
   125  * 
   126  * The cmpfunc should be capable of comparing two keys within this AVL tree.
   127  * So if you want to use null terminated strings as keys, you could use the
   128  * ucx_strcmp() function here.
   129  * 
   130  * @param cmpfunc the compare function that shall be used
   131  * @param allocator the UcxAllocator that shall be used
   132  * @return a new UcxAVLTree object
   133  */
   134 UcxAVLTree *ucx_avl_new_a(cmp_func cmpfunc, UcxAllocator *allocator);
   136 /**
   137  * Destroys an UcxAVLTree.
   138  * @param tree the tree to destroy
   139  */
   140 void ucx_avl_free(UcxAVLTree *tree);
   142 /**
   143  * Macro for initializing a new UcxAVLTree with the default allocator and a
   144  * ucx_ptrcmp() compare function.
   145  * 
   146  * @return a new default UcxAVLTree object
   147  */
   148 #define ucx_avl_default_new() ucx_avl_new_a(ucx_ptrcmp, ucx_default_allocator())
   150 /**
   151  * Gets the node from the tree, that is associated with the specified key.
   152  * @param tree the UcxAVLTree
   153  * @param key the key
   154  * @return the node (or <code>NULL</code>, if the key is not present)
   155  */
   156 UcxAVLNode *ucx_avl_get_node(UcxAVLTree *tree, intptr_t key);
   158 /**
   159  * Gets the value from the tree, that is associated with the specified key.
   160  * @param tree the UcxAVLTree
   161  * @param key the key
   162  * @return the value (or <code>NULL</code>, if the key is not present)
   163  */
   164 void *ucx_avl_get(UcxAVLTree *tree, intptr_t key);
   166 /**
   167  * Puts a key/value pair into the tree.
   168  * 
   169  * Attention: use this function only, if a possible old value does not need
   170  * to be preserved.
   171  * 
   172  * @param tree the UcxAVLTree
   173  * @param key the key
   174  * @param value the new value
   175  * @return zero, if and only if the operation succeeded
   176  */
   177 int ucx_avl_put(UcxAVLTree *tree, intptr_t key, void *value);
   179 /**
   180  * Puts a key/value pair into the tree.
   181  * 
   182  * This is a secure function which saves the old value to the variable pointed
   183  * at by oldvalue.
   184  * 
   185  * @param tree the UcxAVLTree
   186  * @param key the key
   187  * @param value the new value
   188  * @param oldvalue optional: a pointer to the location where a possible old
   189  * value shall be stored
   190  * @return zero, if and only if the operation succeeded
   191  */
   192 int ucx_avl_put_s(UcxAVLTree *tree, intptr_t key, void *value, void **oldvalue);
   194 /**
   195  * Removes a node from the AVL tree.
   196  * 
   197  * Note: the specified node is logically removed. The tree implementation
   198  * decides which memory area is freed. In most cases the here provided node
   199  * is freed, so it's further use is generally undefined.
   200  * 
   201  * @param tree the UcxAVLTree
   202  * @param node the node to remove
   203  * @return zero, if and only if an element has been removed
   204  */
   205 int ucx_avl_remove_node(UcxAVLTree *tree, UcxAVLNode *node);
   207 /**
   208  * Removes an element from the AVL tree.
   209  * 
   210  * @param tree the UcxAVLTree
   211  * @param key the key
   212  * @return zero, if and only if an element has been removed
   213  */
   214 int ucx_avl_remove(UcxAVLTree *tree, intptr_t key);
   216 /**
   217  * Removes an element from the AVL tree.
   218  * 
   219  * This is a secure function which saves the old key and value data from node
   220  * to the variables at the location of oldkey and oldvalue (if specified), so
   221  * they can be freed afterwards (if necessary).
   222  * 
   223  * Note: the returned key in oldkey is possibly not the same as the provided
   224  * key for the lookup (in terms of memory location).
   225  * 
   226  * @param tree the UcxAVLTree
   227  * @param key the key of the element to remove
   228  * @param oldkey optional: a pointer to the location where the old key shall be
   229  * stored
   230  * @param oldvalue optional: a pointer to the location where the old value
   231  * shall be stored
   232  * @return zero, if and only if an element has been removed
   233  */
   234 int ucx_avl_remove_s(UcxAVLTree *tree, intptr_t key,
   235         intptr_t *oldkey, void **oldvalue);
   237 /**
   238  * Counts the nodes in the specified UcxAVLTree.
   239  * @param tree the AVL tree
   240  * @return the node count
   241  */
   242 size_t ucx_avl_count(UcxAVLTree *tree);
   244 #ifdef	__cplusplus
   245 }
   246 #endif
   248 #endif	/* UCX_AVL_H */

mercurial