#ifndef BREEZE_HEAP_H
#define BREEZE_HEAP_H

#include "../defines.h"

void *_bzHeapCreate(i32 startCapacity, i32 stride, i32 weightOffset);
void _bzHeapDestroy(void *heap);
void _bzHeapClear(void *heap);

i32 _bzHeapSize(void *heap);
bool _bzHeapIsEmpty(void *heap);
i32 _bzHeapPop(void *heap);
void _bzHeapPush(void *heap);
i32 _bzHeapPushIdx(void *heap);
void _bzHeapUpdate(void *heap, i32 idx);

#define bzHeapCreate(T, n) (T *) ((T *)_bzHeapCreate((n), sizeof(T), offsetof(T, weight)))
#define bzHeapDestroy(heap) _bzHeapDestroy((void *) (heap))
#define bzHeapClear(heap) _bzHeapClear((void *) (heap))

#define bzHeapSize(heap) _bzHeapSize((void *) (heap))
#define bzHeapIsEmpty(heap) _bzHeapIsEmpty((void *) (heap))
#define bzHeapPop(heap) ((heap)[_bzHeapPop((void *) (heap))])
#define bzHeapPush(heap, ...) do {                  \
    void *h = (void *) (heap);                      \
    (heap)[_bzHeapPushIdx(h)] = (__VA_ARGS__);   \
    _bzHeapPush(h);                                 \
} while(0)
#define bzHeapUpdate(heap, idx) _bzHeapUpdate((void *) heap, idx)


#endif //BREEZE_HEAP_H
