STATIC mp_obj_t mod_uheapq_heapify(mp_obj_t heap_in) { mp_obj_list_t *heap = get_heap(heap_in); for (mp_uint_t i = heap->len / 2; i > 0;) { heap_siftup(heap, --i); } return mp_const_none; }
STATIC mp_obj_t mod_uheapq_heappop(mp_obj_t heap_in) { mp_obj_list_t *heap = get_heap(heap_in); if (heap->len == 0) { nlr_raise(mp_obj_new_exception_msg(&mp_type_IndexError, "empty heap")); } mp_obj_t item = heap->items[0]; heap->len -= 1; heap->items[0] = heap->items[heap->len]; heap->items[heap->len] = MP_OBJ_NULL; // so we don't retain a pointer if (heap->len) { heap_siftup(heap, 0); } return item; }
void *heap_remove(heap_t *h, int k) { void *data; if (k >= h->len) { return NULL; } data = h->data[k]; --h->len; heap_set(h, k, h->data[h->len]); heap_siftdown(h, k); heap_siftup(h, k); if (h->record) { h->record(data, -1); } return data; }