37 Node* front =
_head.load(std::memory_order_relaxed);
38 front->
Next.store(
nullptr, std::memory_order_relaxed);
47 Node* front =
_head.load(std::memory_order_relaxed);
54 Node* prevHead =
_head.exchange(node, std::memory_order_acq_rel);
55 prevHead->
Next.store(node, std::memory_order_release);
60 Node* tail =
_tail.load(std::memory_order_relaxed);
61 Node* next = tail->
Next.load(std::memory_order_acquire);
66 _tail.store(next, std::memory_order_release);
77 Next.store(
nullptr, std::memory_order_relaxed);
93template<
typename T, std::atomic<T*> T::* IntrusiveLink>
104 dummyNext->store(
nullptr, std::memory_order_relaxed);
119 (input->*IntrusiveLink).store(
nullptr, std::memory_order_release);
120 T* prevHead =
_head.exchange(input, std::memory_order_acq_rel);
121 (prevHead->*IntrusiveLink).store(input, std::memory_order_release);
126 T* tail =
_tail.load(std::memory_order_relaxed);
127 T* next = (tail->*IntrusiveLink).load(std::memory_order_acquire);
133 _tail.store(next, std::memory_order_release);
135 next = (next->*IntrusiveLink).load(std::memory_order_acquire);
140 _tail.store(next, std::memory_order_release);
145 T* head =
_head.load(std::memory_order_acquire);
150 next = (tail->*IntrusiveLink).load(std::memory_order_acquire);
153 _tail.store(next, std::memory_order_release);
161 alignas(T) std::array<std::byte,
sizeof(T)>
_dummy;
172template<
typename T, std::atomic<T*> T::* IntrusiveLink =
nullptr>
std::conditional_t< IntrusiveLink !=nullptr, Trinity::Impl::MPSCQueueIntrusive< T, IntrusiveLink >, Trinity::Impl::MPSCQueueNonIntrusive< T > > MPSCQueue
std::array< std::byte, sizeof(T)> _dummy
MPSCQueueIntrusive(MPSCQueueIntrusive const &)=delete
MPSCQueueIntrusive & operator=(MPSCQueueIntrusive const &)=delete
std::atomic< T * > Atomic
MPSCQueueNonIntrusive & operator=(MPSCQueueNonIntrusive const &)=delete
std::atomic< Node * > _head
std::atomic< Node * > _tail
MPSCQueueNonIntrusive(MPSCQueueNonIntrusive const &)=delete
std::atomic< Node * > Next