From 52ab0ff37be33746b2718496453d3616f62fc615 Mon Sep 17 00:00:00 2001 From: dhickin Date: Fri, 22 Aug 2014 22:32:31 +0100 Subject: [PATCH] NTNDArray. Created builder. Removed create and clone. --- src/nt/ntndarray.cpp | 124 +++++++++++++++++++++++++++++-------------- src/nt/ntndarray.h | 96 +++++++++++++++++++++++++++------ 2 files changed, 165 insertions(+), 55 deletions(-) diff --git a/src/nt/ntndarray.cpp b/src/nt/ntndarray.cpp index 9c01444..7590384 100644 --- a/src/nt/ntndarray.cpp +++ b/src/nt/ntndarray.cpp @@ -14,41 +14,14 @@ using namespace epics::pvData; namespace epics { namespace nt { -const std::string NTNDArray::URI("uri:ev4:nt/2012/pwd:NTNDArray"); +namespace detail { + const std::string ntAttrStr("uri:ev4:nt/2012/pwd:NTAttribute"); static FieldCreatePtr fieldCreate = getFieldCreate(); static PVDataCreatePtr pvDataCreate = getPVDataCreate(); -bool NTNDArray::is_a(StructureConstPtr const & structure) -{ - return structure->getID() == URI; -} - - -NTNDArrayPtr NTNDArray::create(epics::pvData::PVStructurePtr const &pvStructure) -{ - return NTNDArrayPtr(new NTNDArray(pvStructure)); -} - -NTNDArrayPtr NTNDArray::create(bool hasDescriptor, - bool hasTimeStamp, bool hasAlarm, bool hasDisplay) -{ - PVStructurePtr pvStructure = pvDataCreate->createPVStructure( - createStructure(hasDescriptor, hasTimeStamp, hasAlarm, hasDisplay)); - return NTNDArrayPtr(new NTNDArray(pvStructure)); -} - - -NTNDArrayPtr NTNDArray::create() -{ - return create(true,true,true,true); -} - - - -StructureConstPtr NTNDArray::createStructure(bool hasDescriptor, - bool hasTimeStamp, bool hasAlarm, bool hasDisplay) +StructureConstPtr NTNDArrayBuilder::createStructure() { enum { @@ -71,10 +44,10 @@ StructureConstPtr NTNDArray::createStructure(bool hasDescriptor, Lock xx(mutex); size_t index = 0; - if (hasDescriptor) index |= 1 << DISCRIPTOR_INDEX; - if (hasTimeStamp) index |= 1 << TIMESTAMP_INDEX; - if (hasAlarm) index |= 1 << ALARM_INDEX; - if (hasDisplay) index |= 1 << DISPLAY_INDEX; + if (descriptor) index |= 1 << DISCRIPTOR_INDEX; + if (timeStamp) index |= 1 << TIMESTAMP_INDEX; + if (alarm) index |= 1 << ALARM_INDEX; + if (display) index |= 1 << DISPLAY_INDEX; if (ntndarrayStruc[index] == NULL) { @@ -121,7 +94,7 @@ StructureConstPtr NTNDArray::createStructure(bool hasDescriptor, createStructure(); } - fb->setId(URI)-> + fb->setId(NTNDArray::URI)-> add("value", valueType)-> add("compressedSize", pvLong)-> add("uncompressedSize", pvLong)-> @@ -131,10 +104,17 @@ StructureConstPtr NTNDArray::createStructure(bool hasDescriptor, add("uniqueId", pvInt)-> addArray("attribute", attributeStruc); - if (hasDescriptor) fb->add("descriptor", pvString); - if (hasAlarm) fb->add("alarm", standardField->alarm()); - if (hasTimeStamp) fb->add("timeStamp", standardField->timeStamp()); - if (hasDisplay) fb->add("display", standardField->display()); + if (descriptor) + fb->add("descriptor", pvString); + + if (timeStamp) + fb->add("timeStamp", standardField->timeStamp()); + + if (alarm) + fb->add("alarm", standardField->alarm()); + + if (display) + fb->add("display", standardField->display()); ntndarrayStruc[index] = fb->createStructure(); } @@ -142,6 +122,72 @@ StructureConstPtr NTNDArray::createStructure(bool hasDescriptor, return ntndarrayStruc[index]; } +NTNDArrayBuilder::shared_pointer NTNDArrayBuilder::addDescriptor() +{ + descriptor = true; + return shared_from_this(); +} + +NTNDArrayBuilder::shared_pointer NTNDArrayBuilder::addAlarm() +{ + alarm = true; + return shared_from_this(); +} + +NTNDArrayBuilder::shared_pointer NTNDArrayBuilder::addTimeStamp() +{ + timeStamp = true; + return shared_from_this(); +} + +NTNDArrayBuilder::shared_pointer NTNDArrayBuilder::addDisplay() +{ + display = true; + return shared_from_this(); +} + +PVStructurePtr NTNDArrayBuilder::createPVStructure() +{ + return getPVDataCreate()->createPVStructure(createStructure()); +} + +NTNDArrayPtr NTNDArrayBuilder::create() +{ + return NTNDArrayPtr(new NTNDArray(createPVStructure())); +} + +NTNDArrayBuilder::NTNDArrayBuilder() +{ + reset(); +} + +void NTNDArrayBuilder::reset() +{ + descriptor = false; + timeStamp = false; + alarm = false; + display = false; +} + +} + +const std::string NTNDArray::URI("uri:ev4:nt/2012/pwd:NTNDArray"); +const std::string ntAttrStr("uri:ev4:nt/2012/pwd:NTAttribute"); + +static FieldCreatePtr fieldCreate = getFieldCreate(); +static PVDataCreatePtr pvDataCreate = getPVDataCreate(); + +bool NTNDArray::is_a(StructureConstPtr const & structure) +{ + return structure->getID() == URI; +} + +NTNDArrayBuilderPtr NTNDArray::createBuilder() +{ + return NTNDArrayBuilderPtr(new detail::NTNDArrayBuilder()); +} + + bool NTNDArray::attachTimeStamp(PVTimeStamp &pvTimeStamp) const { PVStructurePtr ts = getTimeStamp(); diff --git a/src/nt/ntndarray.h b/src/nt/ntndarray.h index 0562178..a60b5d6 100644 --- a/src/nt/ntndarray.h +++ b/src/nt/ntndarray.h @@ -17,6 +17,82 @@ namespace epics { namespace nt { class NTNDArray; typedef std::tr1::shared_ptr NTNDArrayPtr; +namespace detail { + + /** + * Interface for in-line creating of NTNDArray. + * One instance can be used to create multiple instances. + * An instance of this object must not be used concurrently (an object has a state). + * @author mse + */ + class epicsShareClass NTNDArrayBuilder : + public std::tr1::enable_shared_from_this + { + public: + POINTER_DEFINITIONS(NTNDArrayBuilder); + + /** + * Add descriptor field to the NTNDArray. + * @return this instance of a {@code NTNDArrayBuilder}. + */ + shared_pointer addDescriptor(); + + /** + * Add alarm structure to the NTNDArray. + * @return this instance of a {@code NTNDArrayBuilder}. + */ + shared_pointer addAlarm(); + + /** + * Add timeStamp structure to the NTNDArray. + * @return this instance of a {@code NTNDArrayBuilder}. + */ + shared_pointer addTimeStamp(); + + /** + * Add display structure to the NTNDArray. + * @return this instance of a {@code NTNDArrayBuilder}. + */ + shared_pointer addDisplay(); + + /** + * Create a {@code Structure} that represents NTNDArray. + * This resets this instance state and allows new instance to be created. + * @return a new instance of a {@code Structure}. + */ + epics::pvData::StructureConstPtr createStructure(); + + /** + * Create a {@code PVStructure} that represents NTNDArray. + * This resets this instance state and allows new {@code instance to be created. + * @return a new instance of a {@code PVStructure} + */ + epics::pvData::PVStructurePtr createPVStructure(); + + /** + * Create a {@code NTNDArray} instance. + * This resets this instance state and allows new {@code instance to be created. + * @return a new instance of a {@code NTNDArray} + */ + NTNDArrayPtr create(); + + private: + NTNDArrayBuilder(); + + void reset(); + + bool descriptor; + bool timeStamp; + bool alarm; + bool display; + + friend class ::epics::nt::NTNDArray; + }; + +} + +typedef std::tr1::shared_ptr NTNDArrayBuilderPtr; + /** * Convenience Class for NTNDArray * @author dgh @@ -35,22 +111,11 @@ public: */ static bool is_a(epics::pvData::StructureConstPtr const & structure); - - static NTNDArrayPtr create( - epics::pvData::PVStructurePtr const &pvStructure); - - static NTNDArrayPtr create(bool hasDescriptor, - bool hasTimeStamp, bool hasAlarm, bool hasDisplay); - - static NTNDArrayPtr create(); - - static NTNDArrayPtr clone(epics::pvData::PVStructurePtr const &); - /** - * Create a {@code Structure} that represents NTNDArray. + * Create a NTNDArrayBuilder instance + * @return builder instance. */ - static epics::pvData::StructureConstPtr createStructure(bool hasDescriptor, - bool hasTimeStamp, bool hasAlarm, bool hasDisplay); + static NTNDArrayBuilderPtr createBuilder(); /** * Destructor. @@ -153,11 +218,10 @@ public: */ epics::pvData::PVStructurePtr getAlarm() const; - - private: NTNDArray(epics::pvData::PVStructurePtr const & pvStructure); epics::pvData::PVStructurePtr pvNTNDArray; + friend class detail::NTNDArrayBuilder; }; }}