/* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ /* * This code is based on the CRAB engine * * Copyright (c) Arvind Raja Yadav * * Licensed under MIT * */ #ifndef CRAB_PRIORITYQUEUE_H #define CRAB_PRIORITYQUEUE_H namespace Crab { //! \brief The open heap used by all cost-based search algorithms. //! //! This class template is basically a thin wrapper on top of both the std::deque //! class template and the STL heap operations. template class PriorityQueue { Common::Array _open; bool (*compare)(Node const *, Node const *); public: //! \brief Constructs a new %PriorityQueue that heap-sorts nodes //! using the specified comparator. explicit PriorityQueue(bool (*)(Node const *, Node const *)); //! \brief Returns true if the heap contains no nodes, //! false otherwise. bool empty() const; //! \brief Removes all nodes from the heap. //! //! \post //! - empty() void clear(); //! \brief Returns the number of nodes currently in the heap. size_t size() const; //! \brief Pushes the specified node onto the heap. //! //! The heap will maintain the ordering of its nodes during this operation. //! //! \post //! - ! empty() void push(Node *node); //! \brief Returns the least costly node in the heap. //! //! \pre //! - ! empty() Node *front() const; //! \brief Removes the least costly node from the heap. //! //! The heap will maintain the ordering of its nodes during this operation. //! //! \pre //! - ! empty() void pop(); //! \brief Removes all instances of the specified node from the heap. void remove(Node const *node); //! \brief Enumerates all nodes in the heap so far. //! //! \param sorted the container to which each node will be added. //! //! \pre //! - There must be no NULL pointers in the heap. //! \post //! - All nodes should be sorted by this heap's comparator. void enumerate(Common::Array &sorted) const; }; template PriorityQueue::PriorityQueue(bool (*c)(Node const *, Node const *)) : _open(), compare(c) { } template bool PriorityQueue::empty() const { return _open.empty(); } template void PriorityQueue::clear() { _open.clear(); } template size_t PriorityQueue::size() const { return _open.size(); } template void PriorityQueue::push(Node *node) { _open.insert(Common::upperBound(_open.begin(), _open.end(), node, compare), node); } template Node *PriorityQueue::front() const { return _open.back(); } template void PriorityQueue::pop() { _open.pop_back(); } template void PriorityQueue::remove(Node const *node) { _open.erase(Common::remove(_open.begin(), _open.end(), node), _open.end()); } template void PriorityQueue::enumerate(Common::Array &sorted) const { sorted.resize(_open.size()); Common::copy(_open.begin(), _open.end(), sorted.begin()); } } // End of namespace Crab #endif // CRAB_PRIORITYQUEUE_H