X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=src%2FHeap.h;h=50abaa43c4dec1eb1af3d08be39c51b1ceb1f042;hb=HEAD;hp=c17cb73229842369f46ef166fa1df7a5b24b84cc;hpb=1ff641f9960fa6c6081817a5641afb22fad91dcd;p=cgds.git diff --git a/src/Heap.h b/src/Heap.h index c17cb73..50abaa4 100644 --- a/src/Heap.h +++ b/src/Heap.h @@ -16,19 +16,19 @@ * @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). + OrderType hType; ///< Type of heap: max first (MAX_T) or min first (MIN_T). + UInt arity; ///< Arity of the underlying tree. + Vector* items; ///< Vector of items (any type). + Vector* values; ///< Vector of items values (real numbers). } Heap; /** * @brief Return an allocated and initialized heap. */ Heap* _heap_new( - size_t dataSize, ///< Size in bytes of a heap element. - OrderType hType, ///< Type of heap: max first (MAX_T) or min first (MIN_T). - UInt arity ///< Arity of the underlying tree. + size_t dataSize, ///< Size in bytes of a heap element. + OrderType hType, ///< Type of heap: max first (MAX_T) or min first (MIN_T). + UInt arity ///< Arity of the underlying tree. ); /** @@ -40,27 +40,27 @@ Heap* _heap_new( * Usage: Heap* heap_new( type, OrderType hType, UInt arity) */ #define heap_new(type, hType, arity) \ - _heap_new(sizeof(type), hType, arity) + _heap_new(sizeof(type), hType, arity) /** * @brief Copy constructor (shallow copy, ok for basic types). */ Heap* heap_copy( - Heap* heap ///< "this" pointer. + Heap* heap ///< "this" pointer. ); /** * @brief Check if the heap is empty. */ bool heap_empty( - Heap* heap ///< "this" pointer. + Heap* heap ///< "this" pointer. ); /** * @brief Return the size of current heap. */ UInt heap_size( - Heap* heap ///< "this" pointer. + Heap* heap ///< "this" pointer. ); /** @@ -68,8 +68,8 @@ UInt heap_size( * in O(log(n)) operations. */ void _heap_bubble_up( - Heap* heap, ///< "this" pointer. - UInt startIndex ///< Index to bubble up. + Heap* heap, ///< "this" pointer. + UInt startIndex ///< Index to bubble up. ); /** @@ -77,17 +77,17 @@ void _heap_bubble_up( * in O(log(n)) operations. */ void _heap_bubble_down( - Heap* heap, ///< "this" pointer. - UInt startIndex ///< Index to bubble down. + Heap* heap, ///< "this" pointer. + UInt startIndex ///< Index to bubble down. ); /** * @brief Insert a pair (item,value) inside the heap. */ void _heap_insert( - Heap* heap, ///< "this" pointer. - void* item, ///< Pointer to an item of type as defined in the constructor. - Real value ///< Value associated with the item. + Heap* heap, ///< "this" pointer. + void* item, ///< Pointer to an item of type as defined in the constructor. + Real value ///< Value associated with the item. ); /** @@ -100,109 +100,95 @@ void _heap_insert( */ #define heap_insert(heap, item, value) \ { \ - typeof((item)) tmp = item; \ - _heap_insert(heap, &tmp, value); \ + typeof(item) tmp = item; \ + _heap_insert(heap, &tmp, value); \ } /** * @brief Change the value of an item at a given index. */ void _heap_modify( - Heap* heap, ///< "this" pointer. - UInt index, ///< Index of the item to modify. - Real newValue ///< New value for the item. + Heap* heap, ///< "this" pointer. + 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); \ } /** * @brief Remove an item-value at a given index. */ void _heap_remove( - Heap* heap, ///< "this" pointer. - UInt index ///< Index of the item to remove. + Heap* heap, ///< "this" pointer. + 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( - Heap* heap ///< "this" pointer. +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); \ } /** * @brief Remove the top of the heap. */ void heap_pop( - Heap* heap ///< "this" pointer. + Heap* heap ///< "this" pointer. ); /** * @brief Clear the entire heap. */ void heap_clear( - Heap* heap ///< "this" pointer. + Heap* heap ///< "this" pointer. ); /** * @brief Destroy the heap: clear it, and free 'heap' pointer. */ void heap_destroy( - Heap* heap ///< "this" pointer. + Heap* heap ///< "this" pointer. ); #endif