/**
 * @author Francisco José Madrid-Cuevas (fjmadrid@uco.es)
 * @brief Implements the ADT PriorityQueue.
 *
 * @copyright Copyright (c) 2025-
 *
 * Sólo se permite el uso de este código en la docencia de las asignaturas sobre
 * Estructuras de Datos de la Universidad de Córdoba.
 *
 * Está prohibido su uso para cualquier otro objetivo.
 *
 */
#pragma once
#include <cassert>
#include <priority_queue.hpp>

template <class T>
bool PriorityQueue<T>::is_empty() const
{
    return heap_.is_empty();
}

template <class T>
size_t PriorityQueue<T>::size() const
{
    size_t ret_v = heap_.size();
    assert(!heap_.is_empty() || ret_v == 0);
    return ret_v;
}

template <class T>
PriorityQueue<T>::PriorityQueue(std::vector<T> &values, Comp const &comp)
    : heap_(values, comp)
{
    assert(values.size() > 0 || is_empty());
}

template <class T>
const T &PriorityQueue<T>::front() const
{
    return heap_.item();
}

template <class T>
void PriorityQueue<T>::enqueue(const T &new_v)
{
#ifndef NDEBUG
    size_t old_size = size();
#endif
    heap_.insert(new_v);
    assert(size() == old_size + 1);
}

template <class T>
void PriorityQueue<T>::dequeue()
{
    assert(!is_empty());
#ifndef NDEBUG
    size_t old_size = size();
#endif
    heap_.remove();
    assert(size() == old_size - 1);
}
