/* queue.h */ /** * Copyright - See the COPYRIGHT that is included with this distribution. * EPICS pvData is distributed subject to a Software License Agreement found * in file LICENSE that is included with this distribution. */ /** * @author mrk */ #include #include #include #include #include #ifndef QUEUE_H #define QUEUE_H namespace epics { namespace pvData { template class Queue { public: POINTER_DEFINITIONS(Queue); typedef std::tr1::shared_ptr queueElementPtr; typedef std::vector queueElementPtrArray; Queue(queueElementPtrArray &); virtual ~Queue(); void clear(); int capacity(); int getNumberFree(); int getNumberUsed(); queueElementPtr & getFree(); void setUsed(queueElementPtr &element); queueElementPtr & getUsed(); void releaseUsed(queueElementPtr &element); private: queueElementPtr nullElement; queueElementPtrArray elements; int size; int numberFree; int numberUsed; int nextGetFree; int nextSetUsed; int nextGetUsed; int nextReleaseUsed; }; template Queue::Queue(std::vector &xxx) : size(xxx.size()), numberFree(size), numberUsed(0), nextGetFree(0), nextSetUsed(0), nextGetUsed(0), nextReleaseUsed(0) { elements.swap(xxx); } template Queue::~Queue(){} template int Queue::capacity(){return size;} template int Queue::getNumberFree(){return numberFree;} template int Queue::getNumberUsed(){return numberUsed;} template void Queue::clear() { numberFree = size; numberUsed = 0; nextGetFree = 0; nextSetUsed = 0; nextGetUsed = 0; nextReleaseUsed = 0; } template std::tr1::shared_ptr & Queue::getFree() { if(numberFree==0) return nullElement; numberFree--; int ind = nextGetFree; std::tr1::shared_ptr queueElement = elements[nextGetFree++]; if(nextGetFree>=size) nextGetFree = 0; return elements[ind]; } template void Queue::setUsed(std::tr1::shared_ptr &element) { if(element!=elements[nextSetUsed++]) { throw std::logic_error("not correct queueElement"); } numberUsed++; if(nextSetUsed>=size) nextSetUsed = 0; } template std::tr1::shared_ptr & Queue::getUsed() { if(numberUsed==0) return nullElement; int ind = nextGetUsed; std::tr1::shared_ptr queueElement = elements[nextGetUsed++]; if(nextGetUsed>=size) nextGetUsed = 0; return elements[ind]; } template void Queue::releaseUsed(std::tr1::shared_ptr &element) { if(element!=elements[nextReleaseUsed++]) { throw std::logic_error( "not queueElement returned by last call to getUsed"); } if(nextReleaseUsed>=size) nextReleaseUsed = 0; numberUsed--; numberFree++; } }} #endif /* QUEUE_H */