#pragma once #include #include #include #include "ListBase.h" template class AtomicListBase { public: AtomicListBase(); ~AtomicListBase() = default; void Enqueue(T& Item); bool Dequeue(T& Item); bool IsEmpty() const; uint32_t Count() const; private: List _List; std::atomic _SyncCount; std::mutex _SyncContext; }; template inline AtomicListBase::AtomicListBase() : _SyncCount(0) { } template inline void AtomicListBase::Enqueue(T& Item) { { std::lock_guard lock(this->_SyncContext); this->_List.EmplaceBack(Item); } this->_SyncCount++; } template inline bool AtomicListBase::Dequeue(T& Item) { { std::lock_guard lock(this->_SyncContext); const auto Length = this->_List.Count(); if (Length > 0) { Item = this->_List[Length - 1]; this->_List.RemoveAt(Length - 1); this->_SyncCount--; return true; } } return false; } template inline bool AtomicListBase::IsEmpty() const { return (this->_SyncCount == 0); } template inline uint32_t AtomicListBase::Count() const { return this->_SyncCount; }