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)
78 if (reset_bins_ || item_count_ > 0) {
82 iter_ = last_insert_iter_ = item_bins_.end();
90 void enqueue(
const double priority, item_t item)
95 if (last_insert_iter_ == item_bins_.end() || last_insert_iter_->first != priority) {
96 last_insert_iter_ = item_bins_.find(priority);
99 if (last_insert_iter_ == item_bins_.end()) {
100 auto map_item = std::make_pair(priority, std::move(std::vector<item_t>()));
104 std::pair<ItemMapIterator, bool> insert_result = item_bins_.insert(std::move(map_item));
105 last_insert_iter_ = insert_result.first;
110 last_insert_iter_->second.push_back(item);
114 if (iter_ == item_bins_.end() || priority < iter_->first) {
115 iter_ = last_insert_iter_;
127 return item_count_ == 0;
136 if (iter_ == item_bins_.end()) {
137 throw std::out_of_range(
"front() called on empty costmap_queue::MapBasedQueue!");
140 return iter_->second.back();
148 if (iter_ != item_bins_.end() && !iter_->second.empty()) {
149 iter_->second.pop_back();
153 auto not_empty = [](
const typename ItemMap::value_type & key_val) {
154 return !key_val.second.empty();
156 iter_ = std::find_if(iter_, item_bins_.end(), not_empty);
160 using ItemMap = std::map<double, std::vector<item_t>>;
161 using ItemMapIterator =
typename ItemMap::iterator;
166 unsigned int item_count_;
167 ItemMapIterator iter_;
168 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.
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.