NTNDArray. Created builder. Removed create and clone.

This commit is contained in:
dhickin
2014-08-22 22:32:31 +01:00
parent 53c89e5a73
commit 52ab0ff37b
2 changed files with 165 additions and 55 deletions

View File

@@ -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();

View File

@@ -17,6 +17,82 @@ namespace epics { namespace nt {
class NTNDArray;
typedef std::tr1::shared_ptr<NTNDArray> 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<NTNDArrayBuilder>
{
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<detail::NTNDArrayBuilder> 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;
};
}}