diff options
Diffstat (limited to 'roms/skiboot/ccan/heap/heap.h')
-rw-r--r-- | roms/skiboot/ccan/heap/heap.h | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/roms/skiboot/ccan/heap/heap.h b/roms/skiboot/ccan/heap/heap.h new file mode 100644 index 000000000..69368a1ce --- /dev/null +++ b/roms/skiboot/ccan/heap/heap.h @@ -0,0 +1,122 @@ +/* Licensed under BSD-MIT - see LICENSE file for details */ +#ifndef CCAN_HEAP_H +#define CCAN_HEAP_H + +#include <stdbool.h> +#include <stdlib.h> + +typedef bool (*heap_less_func_t)(const void *, const void *); + +/** + * struct heap - a simple, generic heap structure + * @data: array of pointers to the heap's entries + * @less: function to compare heap entries + * @cap: capacity of the heap array in @data + * @len: number of valid elements in the heap array + * + * The @less function determines the nature of the heap. If @less is + * something akin to 'return a.foo < b.foo', then the heap will be + * a min heap. Conversely, a '>' predicate will result in a max heap. + * + * Elements in the @data array are allocated as needed, hence the need for + * @cap and @len. + */ +struct heap { + void **data; + heap_less_func_t less; + size_t cap; + size_t len; +}; + +/** + * heap_init - allocate and initialise an empty heap + * @less: function to be used to compare heap entries + * + * Returns a pointer to an initialised heap struct on success, NULL if + * the heap could not be allocated. + * + * See also: HEAP_INIT() + */ +struct heap *heap_init(heap_less_func_t less); + +/** + * HEAP_INIT - initialiser for an empty heap + * @func: comparison function to be used in the heap + * + * Explicit initialiser for a heap. + * + * See also: heap_init() + */ +#define HEAP_INIT(func) { NULL, func, 0, 0 } + +/** + * heap_free - free a heap allocated via heap_init() + * @heap: the heap to be freed + * + * Note that this only frees the heap and its internal resources, not + * the entries pointed to by it. + * + * See also: heap_init() + */ +void heap_free(struct heap *heap); + +/** + * heap_ify - enforce the heap property based on a new comparison function + * @h: heap to be heapified + * @less: new comparison function + * + * Complexity: O(n) + */ +void heap_ify(struct heap *h, heap_less_func_t less); + +/** + * heap_push - push a new heap entry + * @h: heap to receive the new entry + * @data: pointer to the new entry + * + * Returns 0 on success, -1 on error. + * + * Complexity: O(log n) + * + * See also: heap_pop() + */ +int heap_push(struct heap *h, void *data); + +/** + * heap_pop - pops the root heap entry + * @h: heap to pop the head from + * + * Returns the root entry of the heap after extracting it, or NULL on error. + * + * Note: Calling heap_pop() on an empty heap is a bug. When in doubt, + * check heap->len. See heap_peek()'s documentation for an example. + * + * Complexity: O(log n) + * + * See also: heap_push(), heap_peek() + */ +void *heap_pop(struct heap *h); + +/** + * heap_peek - inspect the root entry of a heap + * @h: heap whose root entry is to be inspected + * + * Returns the root entry in the heap, without extracting it from @h. + * + * Note: Calling heap_peek() on an empty heap is a bug; check the heap's + * number of items and act accordingly, as in the example below. + * + * See also: heap_pop() + * + * Example: + * static inline void *heap_peek_safe(const struct heap *h) + * { + * return h->len ? heap_peek(h) : NULL; + * } + */ +static inline void *heap_peek(const struct heap *h) +{ + return h->data[0]; +} + +#endif /* CCAN_HEAP_H */ |