1*83ee113eSDavid van Moolenbroek /* $NetBSD: heap.h,v 1.1.1.3 2014/07/12 11:57:56 spz Exp $ */ 2*83ee113eSDavid van Moolenbroek /* 3*83ee113eSDavid van Moolenbroek * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") 4*83ee113eSDavid van Moolenbroek * Copyright (C) 1997-2001 Internet Software Consortium. 5*83ee113eSDavid van Moolenbroek * 6*83ee113eSDavid van Moolenbroek * Permission to use, copy, modify, and distribute this software for any 7*83ee113eSDavid van Moolenbroek * purpose with or without fee is hereby granted, provided that the above 8*83ee113eSDavid van Moolenbroek * copyright notice and this permission notice appear in all copies. 9*83ee113eSDavid van Moolenbroek * 10*83ee113eSDavid van Moolenbroek * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 11*83ee113eSDavid van Moolenbroek * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 12*83ee113eSDavid van Moolenbroek * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 13*83ee113eSDavid van Moolenbroek * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 14*83ee113eSDavid van Moolenbroek * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 15*83ee113eSDavid van Moolenbroek * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 16*83ee113eSDavid van Moolenbroek * PERFORMANCE OF THIS SOFTWARE. 17*83ee113eSDavid van Moolenbroek */ 18*83ee113eSDavid van Moolenbroek 19*83ee113eSDavid van Moolenbroek /* Id: heap.h,v 1.3 2007/05/19 19:16:25 dhankins Exp */ 20*83ee113eSDavid van Moolenbroek 21*83ee113eSDavid van Moolenbroek #ifndef ISC_HEAP_H 22*83ee113eSDavid van Moolenbroek #define ISC_HEAP_H 1 23*83ee113eSDavid van Moolenbroek 24*83ee113eSDavid van Moolenbroek /*! \file isc/heap.h */ 25*83ee113eSDavid van Moolenbroek 26*83ee113eSDavid van Moolenbroek /*% 27*83ee113eSDavid van Moolenbroek * The comparision function returns ISC_TRUE if the first argument has 28*83ee113eSDavid van Moolenbroek * higher priority than the second argument, and ISC_FALSE otherwise. 29*83ee113eSDavid van Moolenbroek */ 30*83ee113eSDavid van Moolenbroek typedef isc_boolean_t (*isc_heapcompare_t)(void *, void *); 31*83ee113eSDavid van Moolenbroek 32*83ee113eSDavid van Moolenbroek /*% 33*83ee113eSDavid van Moolenbroek * The index function allows the client of the heap to receive a callback 34*83ee113eSDavid van Moolenbroek * when an item's index number changes. This allows it to maintain 35*83ee113eSDavid van Moolenbroek * sync with its external state, but still delete itself, since deletions 36*83ee113eSDavid van Moolenbroek * from the heap require the index be provided. 37*83ee113eSDavid van Moolenbroek */ 38*83ee113eSDavid van Moolenbroek typedef void (*isc_heapindex_t)(void *, unsigned int); 39*83ee113eSDavid van Moolenbroek 40*83ee113eSDavid van Moolenbroek /*% 41*83ee113eSDavid van Moolenbroek * The heapaction function is used when iterating over the heap. 42*83ee113eSDavid van Moolenbroek * 43*83ee113eSDavid van Moolenbroek * NOTE: The heap structure CANNOT BE MODIFIED during the call to 44*83ee113eSDavid van Moolenbroek * isc_heap_foreach(). 45*83ee113eSDavid van Moolenbroek */ 46*83ee113eSDavid van Moolenbroek typedef void (*isc_heapaction_t)(void *, void *); 47*83ee113eSDavid van Moolenbroek 48*83ee113eSDavid van Moolenbroek typedef struct isc_heap isc_heap_t; 49*83ee113eSDavid van Moolenbroek 50*83ee113eSDavid van Moolenbroek isc_result_t 51*83ee113eSDavid van Moolenbroek isc_heap_create(isc_heapcompare_t compare, 52*83ee113eSDavid van Moolenbroek isc_heapindex_t index, unsigned int size_increment, 53*83ee113eSDavid van Moolenbroek isc_heap_t **heapp); 54*83ee113eSDavid van Moolenbroek /*!< 55*83ee113eSDavid van Moolenbroek * \brief Create a new heap. The heap is implemented using a space-efficient 56*83ee113eSDavid van Moolenbroek * storage method. When the heap elements are deleted space is not freed 57*83ee113eSDavid van Moolenbroek * but will be reused when new elements are inserted. 58*83ee113eSDavid van Moolenbroek * 59*83ee113eSDavid van Moolenbroek * Requires: 60*83ee113eSDavid van Moolenbroek *\li "mctx" is valid. 61*83ee113eSDavid van Moolenbroek *\li "compare" is a function which takes two void * arguments and 62*83ee113eSDavid van Moolenbroek * returns ISC_TRUE if the first argument has a higher priority than 63*83ee113eSDavid van Moolenbroek * the second, and ISC_FALSE otherwise. 64*83ee113eSDavid van Moolenbroek *\li "index" is a function which takes a void *, and an unsigned int 65*83ee113eSDavid van Moolenbroek * argument. This function will be called whenever an element's 66*83ee113eSDavid van Moolenbroek * index value changes, so it may continue to delete itself from the 67*83ee113eSDavid van Moolenbroek * heap. This option may be NULL if this functionality is unneeded. 68*83ee113eSDavid van Moolenbroek *\li "size_increment" is a hint about how large the heap should grow 69*83ee113eSDavid van Moolenbroek * when resizing is needed. If this is 0, a default size will be 70*83ee113eSDavid van Moolenbroek * used, which is currently 1024, allowing space for an additional 1024 71*83ee113eSDavid van Moolenbroek * heap elements to be inserted before adding more space. 72*83ee113eSDavid van Moolenbroek *\li "heapp" is not NULL, and "*heap" is NULL. 73*83ee113eSDavid van Moolenbroek * 74*83ee113eSDavid van Moolenbroek * Returns: 75*83ee113eSDavid van Moolenbroek *\li ISC_R_SUCCESS - success 76*83ee113eSDavid van Moolenbroek *\li ISC_R_NOMEMORY - insufficient memory 77*83ee113eSDavid van Moolenbroek */ 78*83ee113eSDavid van Moolenbroek 79*83ee113eSDavid van Moolenbroek void 80*83ee113eSDavid van Moolenbroek isc_heap_destroy(isc_heap_t **heapp); 81*83ee113eSDavid van Moolenbroek /*!< 82*83ee113eSDavid van Moolenbroek * \brief Destroys a heap. 83*83ee113eSDavid van Moolenbroek * 84*83ee113eSDavid van Moolenbroek * Requires: 85*83ee113eSDavid van Moolenbroek *\li "heapp" is not NULL and "*heap" points to a valid isc_heap_t. 86*83ee113eSDavid van Moolenbroek */ 87*83ee113eSDavid van Moolenbroek 88*83ee113eSDavid van Moolenbroek isc_result_t 89*83ee113eSDavid van Moolenbroek isc_heap_insert(isc_heap_t *heap, void *elt); 90*83ee113eSDavid van Moolenbroek /*!< 91*83ee113eSDavid van Moolenbroek * \brief Inserts a new element into a heap. 92*83ee113eSDavid van Moolenbroek * 93*83ee113eSDavid van Moolenbroek * Requires: 94*83ee113eSDavid van Moolenbroek *\li "heapp" is not NULL and "*heap" points to a valid isc_heap_t. 95*83ee113eSDavid van Moolenbroek */ 96*83ee113eSDavid van Moolenbroek 97*83ee113eSDavid van Moolenbroek void 98*83ee113eSDavid van Moolenbroek isc_heap_delete(isc_heap_t *heap, unsigned int index); 99*83ee113eSDavid van Moolenbroek /*!< 100*83ee113eSDavid van Moolenbroek * \brief Deletes an element from a heap, by element index. 101*83ee113eSDavid van Moolenbroek * 102*83ee113eSDavid van Moolenbroek * Requires: 103*83ee113eSDavid van Moolenbroek *\li "heapp" is not NULL and "*heap" points to a valid isc_heap_t. 104*83ee113eSDavid van Moolenbroek *\li "index" is a valid element index, as provided by the "index" callback 105*83ee113eSDavid van Moolenbroek * provided during heap creation. 106*83ee113eSDavid van Moolenbroek */ 107*83ee113eSDavid van Moolenbroek 108*83ee113eSDavid van Moolenbroek void 109*83ee113eSDavid van Moolenbroek isc_heap_increased(isc_heap_t *heap, unsigned int index); 110*83ee113eSDavid van Moolenbroek /*!< 111*83ee113eSDavid van Moolenbroek * \brief Indicates to the heap that an element's priority has increased. 112*83ee113eSDavid van Moolenbroek * This function MUST be called whenever an element has increased in priority. 113*83ee113eSDavid van Moolenbroek * 114*83ee113eSDavid van Moolenbroek * Requires: 115*83ee113eSDavid van Moolenbroek *\li "heapp" is not NULL and "*heap" points to a valid isc_heap_t. 116*83ee113eSDavid van Moolenbroek *\li "index" is a valid element index, as provided by the "index" callback 117*83ee113eSDavid van Moolenbroek * provided during heap creation. 118*83ee113eSDavid van Moolenbroek */ 119*83ee113eSDavid van Moolenbroek 120*83ee113eSDavid van Moolenbroek void 121*83ee113eSDavid van Moolenbroek isc_heap_decreased(isc_heap_t *heap, unsigned int index); 122*83ee113eSDavid van Moolenbroek /*!< 123*83ee113eSDavid van Moolenbroek * \brief Indicates to the heap that an element's priority has decreased. 124*83ee113eSDavid van Moolenbroek * This function MUST be called whenever an element has decreased in priority. 125*83ee113eSDavid van Moolenbroek * 126*83ee113eSDavid van Moolenbroek * Requires: 127*83ee113eSDavid van Moolenbroek *\li "heapp" is not NULL and "*heap" points to a valid isc_heap_t. 128*83ee113eSDavid van Moolenbroek *\li "index" is a valid element index, as provided by the "index" callback 129*83ee113eSDavid van Moolenbroek * provided during heap creation. 130*83ee113eSDavid van Moolenbroek */ 131*83ee113eSDavid van Moolenbroek 132*83ee113eSDavid van Moolenbroek void * 133*83ee113eSDavid van Moolenbroek isc_heap_element(isc_heap_t *heap, unsigned int index); 134*83ee113eSDavid van Moolenbroek /*!< 135*83ee113eSDavid van Moolenbroek * \brief Returns the element for a specific element index. 136*83ee113eSDavid van Moolenbroek * 137*83ee113eSDavid van Moolenbroek * Requires: 138*83ee113eSDavid van Moolenbroek *\li "heapp" is not NULL and "*heap" points to a valid isc_heap_t. 139*83ee113eSDavid van Moolenbroek *\li "index" is a valid element index, as provided by the "index" callback 140*83ee113eSDavid van Moolenbroek * provided during heap creation. 141*83ee113eSDavid van Moolenbroek * 142*83ee113eSDavid van Moolenbroek * Returns: 143*83ee113eSDavid van Moolenbroek *\li A pointer to the element for the element index. 144*83ee113eSDavid van Moolenbroek */ 145*83ee113eSDavid van Moolenbroek 146*83ee113eSDavid van Moolenbroek void 147*83ee113eSDavid van Moolenbroek isc_heap_foreach(isc_heap_t *heap, isc_heapaction_t action, void *uap); 148*83ee113eSDavid van Moolenbroek /*!< 149*83ee113eSDavid van Moolenbroek * \brief Iterate over the heap, calling an action for each element. The 150*83ee113eSDavid van Moolenbroek * order of iteration is not sorted. 151*83ee113eSDavid van Moolenbroek * 152*83ee113eSDavid van Moolenbroek * Requires: 153*83ee113eSDavid van Moolenbroek *\li "heapp" is not NULL and "*heap" points to a valid isc_heap_t. 154*83ee113eSDavid van Moolenbroek *\li "action" is not NULL, and is a function which takes two arguments. 155*83ee113eSDavid van Moolenbroek * The first is a void *, representing the element, and the second is 156*83ee113eSDavid van Moolenbroek * "uap" as provided to isc_heap_foreach. 157*83ee113eSDavid van Moolenbroek *\li "uap" is a caller-provided argument, and may be NULL. 158*83ee113eSDavid van Moolenbroek * 159*83ee113eSDavid van Moolenbroek * Note: 160*83ee113eSDavid van Moolenbroek *\li The heap structure CANNOT be modified during this iteration. The only 161*83ee113eSDavid van Moolenbroek * safe function to call while iterating the heap is isc_heap_element(). 162*83ee113eSDavid van Moolenbroek */ 163*83ee113eSDavid van Moolenbroek 164*83ee113eSDavid van Moolenbroek #endif /* ISC_HEAP_H */ 165