Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}