X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f58700be432433386a2502ca365345a1f5bf3098..de6f834747f9af2af9f110ee3ba3bb9f3f0d01f3:/src/xbt/heap.c diff --git a/src/xbt/heap.c b/src/xbt/heap.c index dae1a1207c..e37675f260 100644 --- a/src/xbt/heap.c +++ b/src/xbt/heap.c @@ -1,18 +1,22 @@ +/* $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. */ @@ -36,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); 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 @@ -52,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; @@ -80,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); @@ -99,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); } @@ -113,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); }