/* monitorQueue.cpp */ /** * Copyright - See the COPYRIGHT that is included with this distribution. * EPICS pvDataCPP is distributed subject to a Software License Agreement found * in file LICENSE that is included with this distribution. */ /* Marty Kraimer 2011.03 */ #include #include "monitorQueue.h" namespace epics { namespace pvData { typedef QueueElement MonitorQueueElement; class MonitorElementImpl : public MonitorElement { public: MonitorElementImpl(PVStructure *pvStructure); ~MonitorElementImpl(){} virtual PVStructure* getPVStructure(); virtual BitSet* getChangedBitSet(); virtual BitSet* getOverrunBitSet(); void setQueueElement(MonitorQueueElement *queueElement); MonitorQueueElement *getQueueElement(); private: PVStructure *pvStructure; std::auto_ptr changedBitSet; std::auto_ptr overrunBitSet; MonitorQueueElement *queueElement; }; MonitorElementImpl::MonitorElementImpl(PVStructure *pvStructure) : pvStructure(pvStructure), changedBitSet(std::auto_ptr(new BitSet(pvStructure->getNumberFields()))), overrunBitSet(std::auto_ptr(new BitSet(pvStructure->getNumberFields()))), queueElement(0) {} PVStructure* MonitorElementImpl::getPVStructure() { return pvStructure; } BitSet* MonitorElementImpl::getChangedBitSet() { return changedBitSet.get(); } BitSet* MonitorElementImpl::getOverrunBitSet() { return overrunBitSet.get(); } void MonitorElementImpl::setQueueElement(MonitorQueueElement *queueElement) { this->queueElement = queueElement; } MonitorQueueElement *MonitorElementImpl::getQueueElement() { return queueElement; } MonitorQueue::MonitorQueue(MonitorElement** elements,int number) : number(number), elements(elements), queue(new Queue(elements,number)) { if(number<2) { throw std::logic_error(String("queueSize must be >=2")); } MonitorQueueElement *queueElement; for(int i=0; igetFree(); MonitorElementImpl *temp = static_cast(queueElement->getObject()); temp->setQueueElement(queueElement); queue->setUsed(queueElement); queue->releaseUsed(queueElement); } } MonitorQueue::~MonitorQueue() { delete queue; for(int i=0; iclear(); } int MonitorQueue::getNumberFree() { return queue->getNumberFree(); } int MonitorQueue::capacity() { return number; } MonitorElement * MonitorQueue::getFree() { MonitorQueueElement *queueElement = queue->getFree(); if(queueElement==0) return 0; return queueElement->getObject(); } void MonitorQueue::setUsed(MonitorElement * element) { MonitorElementImpl *temp = static_cast(element); queue->setUsed(temp->getQueueElement()); } MonitorElement * MonitorQueue::getUsed() { MonitorQueueElement *queueElement = queue->getUsed(); if(queueElement==0) return 0; return queueElement->getObject(); } void MonitorQueue::releaseUsed(MonitorElement * element) { MonitorElementImpl *temp = static_cast(element); queue->releaseUsed(temp->getQueueElement()); } }}