51template <
typename T = u
int8_t>
64 bool peek(T& result)
override {
65 size_t h = head_.load(std::memory_order_acquire);
66 size_t t = tail_.load(std::memory_order_relaxed);
67 if (h == t)
return false;
68 result = buf_[t & mask_];
74 if (capacity_ == 0 || len <= 0)
return 0;
75 size_t t = tail_.load(std::memory_order_acquire);
76 size_t h = head_.load(std::memory_order_relaxed);
77 size_t space = capacity_ - (h - t);
78 size_t n = (size_t)len < space ? (
size_t)len : space;
82 size_t h_idx = h & mask_;
83 size_t first = capacity_ - h_idx;
84 if (first > n) first = n;
85 memcpy(buf + h_idx, data, first *
sizeof(T));
86 memcpy(buf, data + first, (n - first) *
sizeof(T));
88 head_.store(h + n, std::memory_order_release);
94 if (capacity_ == 0 || len <= 0)
return 0;
95 size_t h = head_.load(std::memory_order_acquire);
96 size_t t = tail_.load(std::memory_order_relaxed);
98 size_t n = (size_t)len < avail ? (
size_t)len : avail;
101 T* buf = buf_.data();
102 size_t t_idx = t & mask_;
103 size_t first = capacity_ - t_idx;
104 if (first > n) first = n;
105 memcpy(data, buf + t_idx, first *
sizeof(T));
106 memcpy(data + first, buf, (n - first) *
sizeof(T));
108 tail_.store(t + n, std::memory_order_release);
116 size_t h = head_.load(std::memory_order_acquire);
117 size_t t = tail_.load(std::memory_order_acquire);
122 size_t h = head_.load(std::memory_order_acquire);
123 size_t t = tail_.load(std::memory_order_acquire);
124 return (
int)(capacity_ - (h - t));
130 head_.store(0, std::memory_order_relaxed);
131 tail_.store(0, std::memory_order_relaxed);
171 size_t pow2 = capacity - 1;
172 for (
size_t i = 1; i <=
sizeof(size_t) * 4; i <<= 1) pow2 |= pow2 >> i;
182 bool allocated = buf_.resize(pow2) && buf_.data() !=
nullptr;
183 capacity_ = allocated ? pow2 : 0;
184 mask_ = capacity_ > 0 ? capacity_ - 1 : 0;
190 size_t size()
override {
return capacity_; }
200 size_t capacity_ = 0;
202 bool use_psram_ =
false;
207 alignas(32) std::atomic<size_t> head_{0};
208 alignas(32) std::atomic<size_t> tail_{0};