refactored chunk Queue to seperate class
This commit is contained in:
@@ -1,30 +1,104 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <list>
|
||||
|
||||
#include "../OSSupport/Promise.h"
|
||||
|
||||
//this empty struct allows function inlining
|
||||
template<class T>
|
||||
class cDeleter
|
||||
struct cQueueFuncs
|
||||
{
|
||||
public:
|
||||
static void Delete(T) {};
|
||||
}
|
||||
static void Combine(T&, const T) {};
|
||||
};
|
||||
|
||||
template<class T, class D = cDelete>
|
||||
template<class ItemType, class Funcs = cQueueFuncs<ItemType> >
|
||||
class cQueue
|
||||
{
|
||||
|
||||
typedef typename std::list<ItemType> ListType;
|
||||
//magic typedef to persuade clang that the iterator is a type
|
||||
typedef typename ListType::iterator iterator;
|
||||
public:
|
||||
cQueue(int warnsize);
|
||||
cQueue(cQueue<T>& queue);
|
||||
~cQueue();
|
||||
cQueue() {}
|
||||
~cQueue() {}
|
||||
|
||||
void EnqueueItem(ItemType a_item)
|
||||
{
|
||||
cCSLock Lock(m_CS);
|
||||
m_contents.push_back(a_item);
|
||||
m_evtAdded.Set();
|
||||
}
|
||||
void EnqueueItemIfNotPresent(ItemType a_item)
|
||||
{
|
||||
cCSLock Lock(m_CS);
|
||||
|
||||
for (iterator itr = m_contents.begin(); itr != m_contents.end(); ++itr)
|
||||
{
|
||||
if((*itr) == a_item) {
|
||||
Funcs funcTable;
|
||||
funcTable.Combine(*itr,a_item);
|
||||
return;
|
||||
}
|
||||
}
|
||||
m_contents.push_back(a_item);
|
||||
m_evtAdded.Set();
|
||||
}
|
||||
bool TryDequeueItem(ItemType& item)
|
||||
{
|
||||
cCSLock Lock(m_CS);
|
||||
if (m_contents.size() == 0) return false;
|
||||
item = m_contents.front();
|
||||
m_contents.pop_front();
|
||||
return true;
|
||||
}
|
||||
ItemType DequeueItem()
|
||||
{
|
||||
cCSLock Lock(m_CS);
|
||||
while (m_contents.size() == 0)
|
||||
{
|
||||
cCSUnlock Unlock(m_CS);
|
||||
m_evtAdded.Wait();
|
||||
}
|
||||
return m_contents.pop_front();
|
||||
}
|
||||
cPromise* BlockTillEmpty() {
|
||||
return new cEmptyQueuePromise(this);
|
||||
}
|
||||
//can all be inlined when delete is a noop
|
||||
void Clear()
|
||||
{
|
||||
cCSLock Lock(m_CS);
|
||||
Funcs funcTable;
|
||||
while (!m_contents.empty())
|
||||
{
|
||||
funcTable.Delete(m_contents.front());
|
||||
m_contents.pop_front();
|
||||
}
|
||||
}
|
||||
size_t Size()
|
||||
{
|
||||
cCSLock Lock(m_CS);
|
||||
return m_contents.size();
|
||||
}
|
||||
bool Remove(ItemType item)
|
||||
{
|
||||
cCSLock Lock(m_CS);
|
||||
m_contents.remove(item);
|
||||
}
|
||||
|
||||
void EnqueueItem(T item);
|
||||
bool TryDequeueItem(T& item);
|
||||
T DequeueItem();
|
||||
void BlockTillEmpty(cEvent CancelationEvent);
|
||||
void Clear();
|
||||
int Size();
|
||||
|
||||
private:
|
||||
int warnsize;
|
||||
}
|
||||
ListType m_contents;
|
||||
cCriticalSection m_CS;
|
||||
cEvent m_evtAdded;
|
||||
|
||||
//template classes must be implemented in the header
|
||||
#include "Queue.inc"
|
||||
class cEmptyQueuePromise : public cPromise {
|
||||
public:
|
||||
cEmptyQueuePromise(cQueue* a_Queue) : cPromise(), m_Queue(a_Queue) {}
|
||||
virtual bool IsCompleted() {return m_Queue->Size() != 0;}
|
||||
private:
|
||||
cQueue* m_Queue;
|
||||
};
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user