* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: heap.c,v 1.37 2007/10/19 17:15:53 explorer Exp $ */
+/* $Id: heap.c,v 1.37.240.1 2010/02/04 23:27:32 jinmei Exp $ */
/*! \file
* Heap implementation of priority queues adapted from the following:
i > 1 && heap->compare(elt, heap->array[p]) ;
i = p, p = heap_parent(i)) {
heap->array[i] = heap->array[p];
+ INSIST(heap->array[i] != NULL);
if (heap->index != NULL)
(heap->index)(heap->array[i], i);
}
heap->array[i] = elt;
+ INSIST(heap->array[i] != NULL);
if (heap->index != NULL)
(heap->index)(heap->array[i], i);
if (heap->compare(elt, heap->array[j]))
break;
heap->array[i] = heap->array[j];
+ INSIST(heap->array[i] != NULL);
if (heap->index != NULL)
(heap->index)(heap->array[i], i);
i = j;
}
heap->array[i] = elt;
+ INSIST(heap->array[i] != NULL);
if (heap->index != NULL)
(heap->index)(heap->array[i], i);
isc_result_t
isc_heap_insert(isc_heap_t *heap, void *elt) {
- unsigned int i;
+ unsigned int new_last;
REQUIRE(VALID_HEAP(heap));
- i = ++heap->last;
- if (heap->last >= heap->size && !resize(heap))
+ new_last = heap->last + 1;
+ RUNTIME_CHECK(new_last > 0); /* overflow check */
+ if (new_last >= heap->size && !resize(heap))
return (ISC_R_NOMEMORY);
+ heap->last = new_last;
- float_up(heap, i, elt);
+ float_up(heap, new_last, elt);
return (ISC_R_SUCCESS);
}
isc_heap_delete(isc_heap_t *heap, unsigned int index) {
void *elt;
isc_boolean_t less;
+ void **array;
+ unsigned int size, last;
REQUIRE(VALID_HEAP(heap));
REQUIRE(index >= 1 && index <= heap->last);
+ array = heap->array;
+ size = heap->size;
+ last = heap->last;
+
if (index == heap->last) {
heap->array[heap->last] = NULL;
heap->last--;
heap->array[heap->last] = NULL;
heap->last--;
+ INSIST(array == heap->array &&
+ size == heap->size &&
+ last == heap->last + 1);
+
less = heap->compare(elt, heap->array[index]);
heap->array[index] = elt;
+ INSIST(heap->array[index] != NULL);
if (less)
float_up(heap, index, heap->array[index]);
else