9#include "Misc/Optional.h"
16template<
typename T,
typename AllocatorType = FMemory>
26 FNode* Node = ::new(AllocatorType::Malloc(
sizeof(FNode),
alignof(FNode))) FNode;
27 Tail.store(Node, std::memory_order_relaxed);
28 Head = First = TailCopy = Node;
35 FNode*
LocalTail = Tail.load(std::memory_order_relaxed);
41 FNode*
Next = Node->Next.load(std::memory_order_relaxed);
43 AllocatorType::Free(Node);
48 while (Node !=
nullptr)
50 FNode*
Next = Node->Next.load(std::memory_order_relaxed);
52 AllocatorType::Free(Node);
60 FNode* Node = AllocNode();
63 Head->Next.store(Node, std::memory_order_release);
72 FNode*
LocalTail = Tail.load(std::memory_order_relaxed);
119 FNode*
LocalTail = Tail.load(std::memory_order_relaxed);
133 std::atomic<FNode*>
Next{
nullptr };
168 return Current->Value.GetUnchecked();
177 std::nullptr_t
end()
const
188 auto AllocFromCache = [
this]()
192 Node->Next.store(
nullptr, std::memory_order_relaxed);
196 if (First != TailCopy)
198 return AllocFromCache();
201 TailCopy = Tail.load(std::memory_order_acquire);
202 if (First != TailCopy)
204 return AllocFromCache();
207 return ::new(AllocatorType::Malloc(
sizeof(FNode),
alignof(FNode))) FNode();
213 std::atomic<FNode*> Tail;
222 std::atomic<int32> NumElems;
FORCEINLINE constexpr void DestructItem(ElementType *Element)
Definition MemoryOps.h:56
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTempIfPossible(T &&Obj) noexcept
Definition UnrealTemplate.h:538
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition SpscQueue.h:18
UE_NONCOPYABLE(TSpscQueue)
ElementType * Peek() const
Definition SpscQueue.h:117
bool Dequeue(ElementType &OutElem)
Definition SpscQueue.h:92
TSpscQueue()
Definition SpscQueue.h:24
FIterator begin() const
Definition SpscQueue.h:172
std::nullptr_t end() const
Definition SpscQueue.h:177
~TSpscQueue()
Definition SpscQueue.h:32
bool IsEmpty() const
Definition SpscQueue.h:104
int32 Num() const
Definition SpscQueue.h:109
void Enqueue(ArgTypes &&... Args)
Definition SpscQueue.h:58
T ElementType
Definition SpscQueue.h:20
TOptional< ElementType > Dequeue()
Definition SpscQueue.h:70
Definition Optional.h:131
Definition SpscQueue.h:146
FIterator(const TSpscQueue &Queue)
Definition SpscQueue.h:149
const ElementType & operator*() const
Definition SpscQueue.h:166
TSpscQueue::FNode * Current
Definition SpscQueue.h:147
FIterator & operator++()
Definition SpscQueue.h:155
bool operator==(std::nullptr_t) const
Definition SpscQueue.h:161
Definition TypeCompatibleBytes.h:24