2 #ifndef _NNDEPLOY_BASE_RING_QUEUE_H_
3 #define _NNDEPLOY_BASE_RING_QUEUE_H_
19 if (min_capacity == 0 || capacity_ >= min_capacity) {
22 size_t new_capacity = nextPowerOfTwo(min_capacity);
23 std::vector<T> new_data(new_capacity);
25 for (
size_t i = 0; i < size_; ++i) {
26 new_data[i] = std::move(data_[(head_ + i) & mask_]);
31 capacity_ = new_capacity;
32 mask_ = capacity_ - 1;
40 size_t tail = (head_ + size_) & mask_;
41 data_[tail] = std::move(value);
46 if (size_ == 0 || capacity_ == 0) {
49 T value = std::move(data_[head_]);
51 head_ = (head_ + 1) & mask_;
57 if (size_ == 0 || capacity_ == 0) {
64 if (size_ == 0 || capacity_ == 0) {
67 size_t tail = (head_ + size_ - 1) & mask_;
71 T
at(
size_t index)
const {
72 if (index >= size_ || capacity_ == 0) {
75 size_t real_index = (head_ + index) & mask_;
76 return data_[real_index];
79 size_t size()
const {
return size_; }
81 bool empty()
const {
return size_ == 0; }
87 for (
size_t i = 0; i < size_; ++i) {
88 data_[(head_ + i) & mask_] = T{};
95 static size_t nextPowerOfTwo(
size_t value) {
97 while (capacity < value) {
104 std::vector<T> data_;
107 size_t capacity_ = 0;
void reserve(size_t min_capacity)