30 size_t head =
head_pos.load(std::memory_order_acquire);
31 size_t tail =
tail_pos.load(std::memory_order_acquire);
32 for (
size_t i = head; i != tail; ++i)
43 size_t head =
head_pos.load(std::memory_order_relaxed);
44 size_t tail =
tail_pos.load(std::memory_order_relaxed);
45 for (
size_t i = head; i != tail; ++i)
51 size_t new_capacity_mask =
capacity - 1;
52 for (
size_t i = 1; i <=
sizeof(
void*) * 4; i <<= 1)
53 new_capacity_mask |= new_capacity_mask >> i;
54 size_t new_capacity_value = new_capacity_mask + 1;
56 vector.resize(new_capacity_value);
63 tail_pos.store(0, std::memory_order_relaxed);
64 head_pos.store(0, std::memory_order_relaxed);
71 p_node[i].
tail.store(i, std::memory_order_relaxed);
72 p_node[i].
head.store(
size_t(-1), std::memory_order_relaxed);
75 tail_pos.store(0, std::memory_order_relaxed);
76 head_pos.store(0, std::memory_order_relaxed);
83 size_t head =
head_pos.load(std::memory_order_seq_cst);
84 size_t tail =
tail_pos.load(std::memory_order_seq_cst);
91 size_t head =
head_pos.load(std::memory_order_seq_cst);
92 size_t tail =
tail_pos.load(std::memory_order_seq_cst);
102 size_t head =
head_pos.load(std::memory_order_relaxed);
107 if (node->
head.load(std::memory_order_acquire) != head)
return false;
108 if (
head_pos.compare_exchange_weak(head, head + 1,
109 std::memory_order_relaxed))
112 result = std::move(*node->
ptr());
119 size_t head =
head_pos.load(std::memory_order_acquire);
120 size_t tail =
tail_pos.load(std::memory_order_acquire);
121 for (
size_t i = head; i != tail; ++i) {
126 head_pos.store(tail, std::memory_order_release);
135 const T*
ptr()
const {
return reinterpret_cast<const T*
>(
storage); }
139 template <
typename U>
143 size_t tail =
tail_pos.load(std::memory_order_relaxed);
148 if (node->
tail.load(std::memory_order_acquire) != tail)
return false;
149 if (
tail_pos.compare_exchange_weak(tail, tail + 1,
150 std::memory_order_relaxed))
153 new (node->
ptr()) T(std::forward<U>(val));
154 node->
head.store(tail, std::memory_order_release);