17 bool push(
const T &value) {
18 size_t write_idx = write_idx_.load(std::memory_order_relaxed);
19 size_t next_idx = (write_idx + 1) % buf_.size();
20 if (next_idx == read_idx_.load(std::memory_order_acquire)) {
23 buf_[write_idx] = value;
24 write_idx_.store(next_idx, std::memory_order_release);
28 std::optional<T>
pop() {
29 size_t write_idx = write_idx_.load(std::memory_order_acquire);
30 size_t read_idx = read_idx_.load(std::memory_order_relaxed);
31 if (write_idx == read_idx) {
34 std::optional<T> value = std::move(buf_[read_idx]);
35 size_t next_idx = (read_idx + 1) % buf_.size();
36 read_idx_.store(next_idx, std::memory_order_release);
40 std::optional<T>
pop(uint32_t timeout) {
42 std::optional<T> value;
43 while (!(value =
pop())) {
44 if (timeout_helper.is_timeout()) {
53 write_idx_.store(0, std::memory_order_relaxed);
54 read_idx_.store(0, std::memory_order_relaxed);
58 size_t write_idx = write_idx_.load(std::memory_order_acquire);
59 size_t read_idx = read_idx_.load(std::memory_order_relaxed);
60 return (write_idx + buf_.size() - read_idx) % buf_.size();
63 size_t capacity()
const {
return buf_.size() - 1; }
67 std::atomic<size_t> write_idx_{0};
68 std::atomic<size_t> read_idx_{0};
bool push(const T &value)
Definition ring_buffer.hpp:17
size_t size() const
Definition ring_buffer.hpp:57
std::optional< T > pop()
Definition ring_buffer.hpp:28
size_t capacity() const
Definition ring_buffer.hpp:63
RingBuffer(size_t capacity)
Definition ring_buffer.hpp:15
void clear()
Definition ring_buffer.hpp:52
std::optional< T > pop(uint32_t timeout)
Definition ring_buffer.hpp:40
void yield()
Definition common.hpp:46