7 #ifndef _PICO_UTIL_PHEAP_H
8 #define _PICO_UTIL_PHEAP_H
17 #ifndef PARAM_ASSERTIONS_ENABLED_PHEAP
18 #define PARAM_ASSERTIONS_ENABLED_PHEAP 0
38 #ifndef PICO_PHEAP_MAX_ENTRIES
39 #define PICO_PHEAP_MAX_ENTRIES 255
43 #if PICO_PHEAP_MAX_ENTRIES < 256
44 typedef uint8_t pheap_node_id_t;
45 #elif PICO_PHEAP_MAX_ENTRIES < 65535
46 typedef uint16_t pheap_node_id_t;
48 #error invalid PICO_PHEAP_MAX_ENTRIES
52 pheap_node_id_t child, sibling, parent;
60 typedef bool (*
pheap_comparator)(
void *user_data, pheap_node_id_t a, pheap_node_id_t b);
66 pheap_node_id_t max_nodes;
67 pheap_node_id_t root_id;
69 pheap_node_id_t free_head_id;
70 pheap_node_id_t free_tail_id;
104 assert(
id && id <= heap->max_nodes);
105 return heap->nodes +
id - 1;
109 static void ph_add_child_node(
pheap_t *heap, pheap_node_id_t parent_id, pheap_node_id_t child_id) {
113 assert(parent_id != child_id);
115 c->parent = parent_id;
119 c->sibling = n->child;
125 static pheap_node_id_t ph_merge_nodes(
pheap_t *heap, pheap_node_id_t a, pheap_node_id_t b) {
128 if (heap->comparator(heap->user_data, a, b)) {
129 ph_add_child_node(heap, a, b);
132 ph_add_child_node(heap, b, a);
144 if (!heap->free_head_id)
return 0;
145 pheap_node_id_t
id = heap->free_head_id;
147 heap->free_head_id = hn->sibling;
148 if (!heap->free_head_id) heap->free_tail_id = 0;
149 hn->child = hn->sibling = hn->parent = 0;
167 hn->child = hn->sibling = hn->parent = 0;
168 heap->root_id = ph_merge_nodes(heap, heap->root_id,
id);
169 return heap->root_id;
180 return heap->root_id;
235 return id == heap->root_id || ph_get_node(heap,
id)->parent;
247 if (heap->free_tail_id) {
248 ph_get_node(heap, heap->free_tail_id)->sibling = id;
250 if (!heap->free_head_id) {
251 assert(!heap->free_tail_id);
252 heap->free_head_id = id;
254 heap->free_tail_id = id;
264 void ph_dump(
pheap_t *heap,
void (*dump_key)(pheap_node_id_t
id,
void *user_data),
void *user_data);
281 #define PHEAP_DEFINE_STATIC(name, _max_nodes) \
282 static_assert(_max_nodes && _max_nodes < (1u << (8 * sizeof(pheap_node_id_t))), ""); \
283 static pheap_node_t name ## _nodes[_max_nodes]; \
284 static pheap_t name = { \
285 .nodes = name ## _nodes, \
286 .max_nodes = _max_nodes \
bool(* pheap_comparator)(void *user_data, pheap_node_id_t a, pheap_node_id_t b)
Definition: pheap.h:60
void ph_destroy(pheap_t *heap)
Definition: pheap.c:37
static void ph_free_node(pheap_t *heap, pheap_node_id_t id)
Definition: pheap.h:245
void ph_clear(pheap_t *heap)
Definition: pheap.c:27
void ph_post_alloc_init(pheap_t *heap, uint max_nodes, pheap_comparator comparator, void *user_data)
Definition: pheap.c:19
static bool ph_contains_node(pheap_t *heap, pheap_node_id_t id)
Definition: pheap.h:234
bool ph_remove_and_free_node(pheap_t *heap, pheap_node_id_t id)
Definition: pheap.c:82
pheap_node_id_t ph_remove_head(pheap_t *heap, bool free)
Definition: pheap.c:76
static pheap_node_id_t ph_peek_head(pheap_t *heap)
Definition: pheap.h:179
void ph_dump(pheap_t *heap, void(*dump_key)(pheap_node_id_t id, void *user_data), void *user_data)
static pheap_node_id_t ph_insert_node(pheap_t *heap, pheap_node_id_t id)
Definition: pheap.h:164
pheap_t * ph_create(uint max_nodes, pheap_comparator comparator, void *user_data)
Definition: pheap.c:11
static pheap_node_id_t ph_remove_and_free_head(pheap_t *heap)
Definition: pheap.h:212
static pheap_node_id_t ph_new_node(pheap_t *heap)
Definition: pheap.h:143