X-Git-Url: https://git.auder.net/?p=cgds.git;a=blobdiff_plain;f=src%2FHeap.h;h=50abaa43c4dec1eb1af3d08be39c51b1ceb1f042;hp=3452aa0d792a0baad25d74460ff119b97aff09e9;hb=1d60b10a9482afc28f4ac027b21edf930d48440c;hpb=588a2232cf24183218d88c85003f2e6093f942ed diff --git a/src/Heap.h b/src/Heap.h index 3452aa0..50abaa4 100644 --- a/src/Heap.h +++ b/src/Heap.h @@ -16,10 +16,10 @@ * @brief Generic d-ary heap. */ typedef struct Heap { - size_t dataSize; ///< Size of a heap item in bytes. OrderType hType; ///< Type of heap: max first (MAX_T) or min first (MIN_T). UInt arity; ///< Arity of the underlying tree. - Vector* array; ///< Vector of ItemValue* (internal representation). + Vector* items; ///< Vector of items (any type). + Vector* values; ///< Vector of items values (real numbers). } Heap; /** @@ -109,31 +109,23 @@ void _heap_insert( */ void _heap_modify( Heap* heap, ///< "this" pointer. - UInt index, ///< Index of the item to modify. + void* item, ///< Pointer to item to modify. Real newValue ///< New value for the item. ); /** * @brief Change the value of an item inside the heap. * @param heap "this" pointer. - * @param item_ Item to modify. + * @param item Item to modify. * @param newValue New value for the item. * @note If several similar items are present, only the first is affected. * - * Usage: void heap_modify(Heap* heap, void item_, Real newValue) - * - * WARNING: does not work if items are not basic type nor pointers. + * Usage: void heap_modify(Heap* heap, void item, Real newValue) */ -#define heap_modify(heap, item_, newValue) \ +#define heap_modify(heap, item, newValue) \ { \ - UInt index = 0; \ - typeof(item_) item__ = item_; \ - for (; indexarray->size; index++) \ - { \ - void* pItem = ((ItemValue*)(heap->array->datas[index]))->item; \ - if (*((typeof(&item__))pItem) == item__) break; \ - } \ - _heap_modify(heap, index, newValue); \ + typeof(item) item_ = item; \ + _heap_modify(heap, &item_, newValue); \ } /** @@ -141,49 +133,41 @@ void _heap_modify( */ void _heap_remove( Heap* heap, ///< "this" pointer. - UInt index ///< Index of the item to remove. + void* item ///< Pointer to item to remove. ); /** * @brief Remove an item-value inside the heap. * @param heap "this" pointer. - * @param item_ Item to remove. + * @param item Item to remove. * @note If several similar items are present, only the first is deleted. * - * Usage: void heap_remove(Heap* heap, void item_) - * - * WARNING: does not work if items are not basic type nor pointers. + * Usage: void heap_remove(Heap* heap, void item) */ -#define heap_remove(heap, item_) \ +#define heap_remove(heap, item) \ { \ - UInt index = 0; \ - typeof(item_) item__ = item_; \ - for (; indexarray->size; index++) \ - { \ - void* pItem = ((ItemValue*)(heap->array->datas[index]))->item; \ - if (*((typeof(&item__))pItem) == item__) break; \ - } \ - _heap_remove(heap, index); \ + typeof(item) item_ = item; \ + _heap_remove(heap, &item_); \ } /** * @brief Return what is at the beginning of the heap. */ -ItemValue* heap_top_raw( +ItemValue _heap_top( Heap* heap ///< "this" pointer. ); /** - * @brief Return what is at the beginning of the heap. + * @brief Get the top heap element in 'item'. * @param heap "this" pointer. - * @param item_ Item to be assigned. + * @param item_ Item to affect. * * Usage: void heap_top(Heap* heap, void item_) */ #define heap_top(heap, item_) \ { \ - void* pItem = heap_top_raw(heap)->item; \ - item_ = *((typeof(&item_))pItem); \ + ItemValue iv = _heap_top(heap); \ + item_ = *((typeof(item_)*) iv.item); \ } /**