X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/188feea2cf5d0362ee0863cd59f5738b07da2aae..de6f834747f9af2af9f110ee3ba3bb9f3f0d01f3:/src/xbt/heap.c diff --git a/src/xbt/heap.c b/src/xbt/heap.c index c01e8b645b..e37675f260 100644 --- a/src/xbt/heap.c +++ b/src/xbt/heap.c @@ -1,27 +1,32 @@ +/* $Id$ */ + /* a generic and efficient heap */ -/* Authors: Arnaud Legrand */ +/* Copyright (c) 2004 Arnaud Legrand. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it - under the terms of the license (GNU LGPL) which comes with this package. */ + * under the terms of the license (GNU LGPL) which comes with this package. */ +#include "xbt/sysdep.h" +#include "xbt/error.h" #include "heap_private.h" +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(heap, xbt, "Heap"); /** * xbt_heap_new: * @init_size: initial size of the heap - * @free_func: function to call on each element when you want to free the whole heap (or NULL if nothing to do). + * @free_func: function to call on each element when you want to free + * the whole heap (or NULL if nothing to do). * * Creates a new heap. */ xbt_heap_t xbt_heap_new(int init_size, void_f_pvoid_t * const free_func) { - xbt_heap_t H = calloc(1, sizeof(struct xbt_heap)); + xbt_heap_t H = xbt_new0(struct xbt_heap, 1); H->size = init_size; H->count = 0; - H->items = - (xbt_heapItem_t) calloc(init_size, sizeof(struct xbt_heapItem)); - H->free = free; + H->items = (xbt_heapItem_t) xbt_new0(struct xbt_heapItem, init_size); + H->free = free_func; return H; } @@ -35,13 +40,24 @@ void xbt_heap_free(xbt_heap_t H) { int i; if (H->free) - for (i = 0; i < H->size; i++) + for (i = 0; i < H->count; i++) H->free(H->items[i].content); - free(H->items); - free(H); + xbt_free(H->items); + xbt_free(H); return; } +/** + * xbt_heap_size: + * @H: the heap we're working on + * + * returns the number of elements in the heap + */ +int xbt_heap_size(xbt_heap_t H) +{ + return (H->count); +} + /** * xbt_heap_push: * @H: the heap we're working on @@ -51,7 +67,7 @@ void xbt_heap_free(xbt_heap_t H) * Add an element int the heap. The element with the smallest key is * automatically moved at the top of the heap. */ -void xbt_heap_push(xbt_heap_t H, void *content, xbt_heap_float_t key) +void xbt_heap_push(xbt_heap_t H, void *content, double key) { int count = ++(H->count); int size = H->size; @@ -79,7 +95,13 @@ void xbt_heap_push(xbt_heap_t H, void *content, xbt_heap_float_t key) */ void *xbt_heap_pop(xbt_heap_t H) { - void *max = CONTENT(H, 0); + void *max; + + if (H->count == 0) + return NULL; + + max = CONTENT(H, 0); + H->items[0] = H->items[(H->count) - 1]; (H->count)--; xbt_heap_maxHeapify(H); @@ -98,8 +120,9 @@ void *xbt_heap_pop(xbt_heap_t H) * * Returns the smallest key in the heap without modifying the heap. */ -xbt_heap_float_t xbt_heap_maxkey(xbt_heap_t H) +double xbt_heap_maxkey(xbt_heap_t H) { + xbt_assert0(H->count != 0,"Empty heap"); return KEY(H, 0); } @@ -112,6 +135,7 @@ xbt_heap_float_t xbt_heap_maxkey(xbt_heap_t H) */ void *xbt_heap_maxcontent(xbt_heap_t H) { + xbt_assert0(H->count != 0,"Empty heap"); return CONTENT(H, 0); }