35 #ifndef COSTMAP_QUEUE__MAP_BASED_QUEUE_HPP_
36 #define COSTMAP_QUEUE__MAP_BASED_QUEUE_HPP_
44 namespace costmap_queue
60 template<
class item_t>
68 : reset_bins_(reset_bins), item_count_(0)
83 if (reset_bins_ || item_count_ > 0) {
87 iter_ = last_insert_iter_ = item_bins_.end();
95 void enqueue(
const double priority, item_t item)
100 if (last_insert_iter_ == item_bins_.end() || last_insert_iter_->first != priority) {
101 last_insert_iter_ = item_bins_.find(priority);
104 if (last_insert_iter_ == item_bins_.end()) {
105 auto map_item = std::make_pair(priority, std::move(std::vector<item_t>()));
109 std::pair<ItemMapIterator, bool> insert_result = item_bins_.insert(std::move(map_item));
110 last_insert_iter_ = insert_result.first;
115 last_insert_iter_->second.push_back(item);
119 if (iter_ == item_bins_.end() || priority < iter_->first) {
120 iter_ = last_insert_iter_;
132 return item_count_ == 0;
141 if (iter_ == item_bins_.end()) {
142 throw std::out_of_range(
"front() called on empty costmap_queue::MapBasedQueue!");
145 return iter_->second.back();
153 if (iter_ != item_bins_.end() && !iter_->second.empty()) {
154 iter_->second.pop_back();
158 auto not_empty = [](
const typename ItemMap::value_type & key_val) {
159 return !key_val.second.empty();
161 iter_ = std::find_if(iter_, item_bins_.end(), not_empty);
165 using ItemMap = std::map<double, std::vector<item_t>>;
166 using ItemMapIterator =
typename ItemMap::iterator;
171 unsigned int item_count_;
172 ItemMapIterator iter_;
173 ItemMapIterator last_insert_iter_;
Templatized interface for a priority queue.
bool isEmpty()
Check to see if there is anything in the queue.
MapBasedQueue(bool reset_bins=true)
Default Constructor.
virtual void reset()
Clear the queue.
virtual ~MapBasedQueue()=default
Default virtual Destructor.
item_t & front()
Return the item at the front of the queue.
void enqueue(const double priority, item_t item)
Add a new item to the queue with a set priority.
void pop()
Remove (and destroy) the item at the front of the queue.