/* 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