39template <
typename T = u
int8_t>
53 size_t h = head_.load(std::memory_order_acquire);
54 size_t t = tail_.load(std::memory_order_relaxed);
55 if (
h ==
t)
return false;
56 result = buf_[
t & mask_];
62 if (capacity_ == 0 || len <= 0)
return 0;
63 size_t t = tail_.load(std::memory_order_acquire);
64 size_t h = head_.load(std::memory_order_relaxed);
65 size_t space = capacity_ - (
h -
t);
70 size_t first = capacity_ -
h_idx;
71 if (first > n) first = n;
73 memcpy(buf_, data + first, (n - first) *
sizeof(
T));
75 head_.store(
h + n, std::memory_order_release);
81 if (capacity_ == 0 || len <= 0)
return 0;
82 size_t h = head_.load(std::memory_order_acquire);
83 size_t t = tail_.load(std::memory_order_relaxed);
89 size_t first = capacity_ -
t_idx;
90 if (first > n) first = n;
92 memcpy(data + first, buf_, (n - first) *
sizeof(
T));
94 tail_.store(
t + n, std::memory_order_release);
102 size_t h = head_.load(std::memory_order_acquire);
103 size_t t = tail_.load(std::memory_order_acquire);
108 size_t h = head_.load(std::memory_order_acquire);
109 size_t t = tail_.load(std::memory_order_acquire);
110 return (
int)(capacity_ - (
h -
t));
116 head_.store(0, std::memory_order_relaxed);
117 tail_.store(0, std::memory_order_relaxed);
125 buf_ = (capacity > 0) ?
new T[
pow2] :
nullptr;
126 capacity_ = (capacity > 0) ?
pow2 : 0;
127 mask_ = capacity_ > 0 ? capacity_ - 1 : 0;
133 size_t size()
override {
return capacity_; }
144 size_t capacity_ = 0;
150 alignas(32) std::atomic<size_t> head_{0};
151 alignas(32) std::atomic<size_t> tail_{0};