26class ClusterPriorityQueue {
27 using Priority = uint32_t;
30 ClusterPriorityQueue() =
default;
32 Error push(
Cluster& cluster, uint32_t priorityRating);
33 constexpr Cluster& front()
const {
return *priority_map_.begin()->second; }
35 constexpr void pop() {
36 auto it = priority_map_.begin();
37 priority_map_.erase(it);
38 queued_clusters_.erase(it->second);
41 constexpr bool empty()
const {
return queued_clusters_.empty() || priority_map_.empty(); }
42 constexpr size_t erase(
Cluster& cluster) {
43 if (
auto search = queued_clusters_.find(&cluster); search != queued_clusters_.end()) {
44 priority_map_.erase({search->second, &cluster});
45 queued_clusters_.erase(&cluster);
53 constexpr bool hasAnyLowestPriority()
const {
54 return !priority_map_.empty() && priority_map_.rbegin()->first == std::numeric_limits<uint32_t>::max();
58 deluge::fast_set<std::pair<Priority, Cluster*>> priority_map_;
59 deluge::fast_unordered_map<Cluster*, Priority> queued_clusters_;