xref: /minix3/external/bsd/dhcp/dist/includes/heap.h (revision 83ee113ee0d94f3844d44065af2311604e9a30ad)
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