32 for (
size_t i = 1; i <=
sizeof(
void*) * 4; i <<= 1)
39 for (
size_t i = 0; i <
capacity; ++i) {
40 p_node[i].
tail.store(i, std::memory_order_relaxed);
41 p_node[i].
head.store(-1, std::memory_order_relaxed);
44 tail_pos.store(0, std::memory_order_relaxed);
45 head_pos.store(0, std::memory_order_relaxed);
53 size_t head =
head_pos.load(std::memory_order_acquire);
54 return tail_pos.load(std::memory_order_relaxed) - head;
63 size_t tail =
tail_pos.load(std::memory_order_relaxed);
66 if (node->
tail.load(std::memory_order_relaxed) != tail)
return false;
67 if ((
tail_pos.compare_exchange_weak(tail, tail + 1,
68 std::memory_order_relaxed)))
71 new (&node->
data)
T(data);
72 node->
head.store(tail, std::memory_order_release);
78 size_t head =
head_pos.load(std::memory_order_relaxed);
81 if (node->
head.load(std::memory_order_relaxed) != head)
return false;
82 if (
head_pos.compare_exchange_weak(head, head + 1,
83 std::memory_order_relaxed))