r5sdk/r5dev/thirdparty/cppnet/cppkore/AtomicListBase.h
Kawe Mazidjatari 3e9f405474 Fix MSVC error 'C2280' and 'C2955'
Fix 'attempting to reference a deleted function'.
Fix 'use of class requires a template argument list'.
2023-03-19 17:58:01 +01:00

76 lines
1.2 KiB
C++

#pragma once
#include <atomic>
#include <thread>
#include <mutex>
#include "ListBase.h"
template<typename T>
class AtomicListBase
{
public:
AtomicListBase();
~AtomicListBase() = default;
void Enqueue(T& Item);
bool Dequeue(T& Item);
bool IsEmpty() const;
uint32_t Count() const;
private:
List<T> _List;
std::atomic<uint32_t> _SyncCount;
std::mutex _SyncContext;
};
template<typename T>
inline AtomicListBase<T>::AtomicListBase()
: _SyncCount(0)
{
}
template<typename T>
inline void AtomicListBase<T>::Enqueue(T& Item)
{
{
std::lock_guard<std::mutex> lock(this->_SyncContext);
this->_List.EmplaceBack(Item);
}
this->_SyncCount++;
}
template<typename T>
inline bool AtomicListBase<T>::Dequeue(T& Item)
{
{
std::lock_guard<std::mutex> 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<typename T>
inline bool AtomicListBase<T>::IsEmpty() const
{
return (this->_SyncCount == 0);
}
template<typename T>
inline uint32_t AtomicListBase<T>::Count() const
{
return this->_SyncCount;
}