static int _siftupmax(heap_t *h, __TYPE spos, __TYPE epos) { __TYPE endpos, childpos, rightpos; __TYPE newitem, *heap, pos; endpos = h->len; heap = h->ary; #ifdef ERROR_CHK if (pos >= endpos) { fprintf(stderr, "_siftupmax: index out of range: %u, len: %u\n", pos, endpos); return -1; } #endif do { pos = spos; /* Bubble up the smaller child until hitting a leaf. */ newitem = heap[pos]; childpos = (pos << 1) + 1; /* leftmost child position */ while (childpos < endpos) { /* Set childpos to index of smaller child. */ rightpos = childpos + 1; if (rightpos < endpos) { if (heap[rightpos] < heap[childpos]) childpos = rightpos; } /* Move the smaller child up. */ heap[pos] = heap[childpos]; pos = childpos; childpos = (pos << 1) + 1; } /* The leaf at pos is empty now. Put newitem there, and and bubble it up to its final resting place (by sifting its parents down). */ heap[pos] = newitem; #ifdef ERROR_CHK if (_siftdownmax(h, spos, pos) == -1) return (-1); #else _siftdownmax(h, spos, pos); #endif spos--; } while (spos >= epos); return (0); }
static int _siftupmax(PyListObject *heap, Py_ssize_t pos) { Py_ssize_t startpos, endpos, childpos, rightpos; int cmp; PyObject *newitem, *tmp; assert(PyList_Check(heap)); endpos = PyList_GET_SIZE(heap); startpos = pos; if (pos >= endpos) { PyErr_SetString(PyExc_IndexError, "index out of range"); return -1; } newitem = PyList_GET_ITEM(heap, pos); Py_INCREF(newitem); /* Bubble up the smaller child until hitting a leaf. */ childpos = 2*pos + 1; /* leftmost child position */ while (childpos < endpos) { /* Set childpos to index of smaller child. */ rightpos = childpos + 1; if (rightpos < endpos) { cmp = PyObject_RichCompareBool( PyList_GET_ITEM(heap, rightpos), PyList_GET_ITEM(heap, childpos), Py_LT); if (cmp == -1) { Py_DECREF(newitem); return -1; } if (cmp == 0) childpos = rightpos; } /* Move the smaller child up. */ tmp = PyList_GET_ITEM(heap, childpos); Py_INCREF(tmp); Py_DECREF(PyList_GET_ITEM(heap, pos)); PyList_SET_ITEM(heap, pos, tmp); pos = childpos; childpos = 2*pos + 1; } /* The leaf at pos is empty now. Put newitem there, and bubble it up to its final resting place (by sifting its parents down). */ Py_DECREF(PyList_GET_ITEM(heap, pos)); PyList_SET_ITEM(heap, pos, newitem); return _siftdownmax(heap, startpos, pos); }
static int _siftupmax(PyListObject *heap, Py_ssize_t pos) { Py_ssize_t startpos, endpos, childpos, rightpos, limit; PyObject *tmp1, *tmp2; int cmp; assert(PyList_Check(heap)); endpos = PyList_GET_SIZE(heap); startpos = pos; if (pos >= endpos) { PyErr_SetString(PyExc_IndexError, "index out of range"); return -1; } /* Bubble up the smaller child until hitting a leaf. */ limit = endpos / 2; /* smallest pos that has no child */ while (pos < limit) { /* Set childpos to index of smaller child. */ childpos = 2*pos + 1; /* leftmost child position */ rightpos = childpos + 1; if (rightpos < endpos) { cmp = PyObject_RichCompareBool( PyList_GET_ITEM(heap, rightpos), PyList_GET_ITEM(heap, childpos), Py_LT); if (cmp == -1) return -1; if (cmp == 0) childpos = rightpos; if (endpos != PyList_GET_SIZE(heap)) { PyErr_SetString(PyExc_RuntimeError, "list changed size during iteration"); return -1; } } /* Move the smaller child up. */ tmp1 = PyList_GET_ITEM(heap, childpos); tmp2 = PyList_GET_ITEM(heap, pos); PyList_SET_ITEM(heap, childpos, tmp2); PyList_SET_ITEM(heap, pos, tmp1); pos = childpos; } /* Bubble it up to its final resting place (by sifting its parents down). */ return _siftdownmax(heap, startpos, pos); }