You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
2.2 KiB

/******************************************************************************
*
* Copyright 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************/
#pragma once
#include <array>
#include <queue>
namespace bluetooth {
namespace common {
/**
* A queue implementation which supports items with multiple priorities.
* Items with greater priority value will be dequeued first.
* When Enqueuing, the user can specify the priority (0 by default).
* This can be used by ACL or L2CAP lower queue end sender to prioritize some link or channel, used by A2DP.
*/
template <typename T, int NUM_PRIORITY_LEVELS = 2>
class MultiPriorityQueue {
static_assert(NUM_PRIORITY_LEVELS > 1);
public:
// Get the front item with the highest priority. Queue must be non-empty.
T& front() {
return queues_[next_to_dequeue_.top()].front();
}
[[nodiscard]] bool empty() const {
return next_to_dequeue_.empty();
}
[[nodiscard]] size_t size() const {
return next_to_dequeue_.size();
}
// Push the item with specified priority
void push(const T& t, int priority = 0) {
queues_[priority].push(t);
next_to_dequeue_.push(priority);
}
// Push the item with specified priority
void push(T&& t, int priority = 0) {
queues_[priority].push(std::forward<T>(t));
next_to_dequeue_.push(priority);
}
// Pop the item in the front
void pop() {
queues_[next_to_dequeue_.top()].pop();
next_to_dequeue_.pop();
}
private:
std::array<std::queue<T>, NUM_PRIORITY_LEVELS> queues_;
std::priority_queue<int> next_to_dequeue_;
};
} // namespace common
} // namespace bluetooth