#include "Queue.hpp" #include template class kPriorityQueue { MyQueue* priorities; size_t size; size_t largestPriority; // за да може peek да се изпълни за константно време void free(); void copyFrom(const kPriorityQueue& other); public: kPriorityQueue(size_t k); void push(const T& obj, size_t kth); void push(T&& obj, size_t kth); void pop(); const T& peek() const; bool isEmpty() const; kPriorityQueue(); kPriorityQueue(const kPriorityQueue& other); kPriorityQueue& operator=(const kPriorityQueue& other); ~kPriorityQueue(); }; template kPriorityQueue::kPriorityQueue(size_t k) { size = k; priorities = new MyQueue[size]; largestPriority = size - 1; } template void kPriorityQueue::push(const T& obj, size_t kth) { if (kth >= size) throw std::invalid_argument("Error! No such priority!"); priorities[kth].push(obj); if (kth > largestPriority) largestPriority = kth; } template void kPriorityQueue::push(T&& obj, size_t kth) { if (kth >= size) throw std::invalid_argument("Error! No such priority!"); priorities[kth].push(obj); if (kth > largestPriority) largestPriority = kth; } template void kPriorityQueue::pop() { if (isEmpty()) throw std::logic_error("Empty priority queue!"); bool success = false; while (!success) { try { priorities[largestPriority].pop(); success = true; if (priorities[largestPriority].isEmpty()) largestPriority--; } catch (std::logic_error e) { largestPriority--; } } } template const T& kPriorityQueue::peek() const { return priorities[largestPriority].peek(); } template bool kPriorityQueue::isEmpty() const { return size == 0; } template kPriorityQueue::kPriorityQueue() : kPriorityQueue(1) {} template kPriorityQueue::kPriorityQueue(const kPriorityQueue& other) { copyFrom(other); } template kPriorityQueue& kPriorityQueue::operator=(const kPriorityQueue& other) { if (this != &other) { free(); copyFrom(other); } return *this; } template kPriorityQueue::~kPriorityQueue() { free(); } template void kPriorityQueue::free() { delete[] priorities; } template void kPriorityQueue::copyFrom(const kPriorityQueue& other) { priorities = new MyQueue[other.size]; for (size_t i = 0; i < other.size; i++) priorities[i] = other.priorities[i]; size = other.size; largestPriority = other.largestPriority; }