#include "heap.hpp" template kernelns::Heap::Heap() { } template kernelns::Heap::Heap(T** array, size_t maxSize) { m_array = array; m_size = 0; m_limit = maxSize; } template T* kernelns::Heap::extractMin() { if(m_size == 0) return nullptr; m_size--; T* p = m_array[0]; m_array[0] = m_array[m_size]; heapify(0); return p; } template void kernelns::Heap::insert(T* n) { if(m_size == m_limit) // TODO: have insert return status code return; size_t i = m_size; m_size++; while(i > 0 && *m_array[(i - 1) / 2] > *n) { m_array[i] = m_array[(i - 1) / 2]; i = (i - 1) / 2; } m_array[i] = n; } template void kernelns::Heap::remove(T* n) { for(size_t i = 0; i < m_size; i++) { if(m_array[i] == n) { m_size--; m_array[i] = m_array[m_size]; heapify(i); break; } } } template void kernelns::Heap::heapify(size_t i) { if(i * 2 + 1 >= m_size) return; if (*m_array[i * 2 + 1] <= *m_array[i] && *m_array[i * 2 + 1] <= *m_array[i * 2 + 2]) { T buffer = m_array[i]; m_array[i] = m_array[i * 2 + 1]; m_array[i * 2 + 1] = buffer; heapify(i * 2 + 1); } else if (*m_array[i * 2 + 2] <= *m_array[i] && *m_array[i * 2 + 2] <= *m_array[i * 2 + 1]) { T buffer = m_array[i]; m_array[i] = m_array[i * 2 + 2]; m_array[i * 2 + 2] = buffer; heapify(i * 2 + 2); } }