3#ifndef DETERMINISTICESPASYNCWEBSERVER_DET_RING_H
4#define DETERMINISTICESPASYNCWEBSERVER_DET_RING_H
55 v.store(o.v.load(std::memory_order_acquire), std::memory_order_release);
60 v.store(x, std::memory_order_release);
63 operator T() const noexcept
65 return v.load(std::memory_order_acquire);
79 return ((
size_t)head + cap - (
size_t)tail) % cap;
83static inline bool det_ring_read_byte(
const uint8_t *buf,
size_t cap,
const DetAtomic<size_t> &head,
87 if (t == (
size_t)head)
95static inline size_t det_ring_read(
const uint8_t *buf,
size_t cap,
const DetAtomic<size_t> &head,
101 while (n < maxn && t != h)
111static inline void det_ring_peek(
const uint8_t *buf,
size_t cap,
const DetAtomic<size_t> &tail,
size_t off,
112 uint8_t *dst,
size_t n)
114 size_t idx = ((size_t)tail + off) % cap;
115 for (
size_t i = 0; i < n; i++)
118 idx = (idx + 1) % cap;
123static inline void det_ring_consume(
DetAtomic<size_t> &tail,
size_t cap,
size_t n)
125 tail = ((size_t)tail + n) % cap;
139 size_t used = ((size_t)head + cap - (
size_t)tail) % cap;
140 return (cap - 1) - used;
149static inline size_t det_ring_write_span(uint8_t *buf,
size_t cap,
size_t head,
const uint8_t *src,
size_t len)
153 size_t chunk = cap - head;
156 memcpy(&buf[head], src, chunk);
157 head = (head + chunk) % cap;
DetAtomic(const DetAtomic &o) noexcept
DetAtomic & operator=(T x) noexcept
DetAtomic & operator=(const DetAtomic &o) noexcept