9 #define epicsExportSharedSymbols 16 namespace epics {
namespace nt {
23 StructureConstPtr NTEnumBuilder::createStructure()
25 FieldBuilderPtr builder =
26 getFieldCreate()->createFieldBuilder()->
28 add(
"value", ntField->createEnumerated());
31 builder->add(
"descriptor", pvString);
34 builder->add(
"alarm", ntField->createAlarm());
37 builder->add(
"timeStamp", ntField->createTimeStamp());
39 size_t extraCount = extraFieldNames.size();
40 for (
size_t i = 0; i< extraCount; i++)
41 builder->add(extraFieldNames[i], extraFields[i]);
44 StructureConstPtr s = builder->createStructure();
50 NTEnumBuilder::shared_pointer NTEnumBuilder::addDescriptor()
53 return shared_from_this();
56 NTEnumBuilder::shared_pointer NTEnumBuilder::addAlarm()
59 return shared_from_this();
62 NTEnumBuilder::shared_pointer NTEnumBuilder::addTimeStamp()
65 return shared_from_this();
68 PVStructurePtr NTEnumBuilder::createPVStructure()
70 return getPVDataCreate()->createPVStructure(createStructure());
78 NTEnumBuilder::NTEnumBuilder()
83 void NTEnumBuilder::reset()
88 extraFieldNames.clear();
92 NTEnumBuilder::shared_pointer NTEnumBuilder::add(
string const & name, FieldConstPtr
const & field)
94 extraFields.push_back(field); extraFieldNames.push_back(name);
95 return shared_from_this();
101 const std::string NTEnum::URI(
"epics:nt/NTEnum:1.0");
103 NTEnum::shared_pointer NTEnum::wrap(PVStructurePtr
const & pvStructure)
105 if(!isCompatible(pvStructure))
return shared_pointer();
106 return wrapUnsafe(pvStructure);
109 NTEnum::shared_pointer NTEnum::wrapUnsafe(PVStructurePtr
const & pvStructure)
111 return shared_pointer(
new NTEnum(pvStructure));
114 bool NTEnum::is_a(StructureConstPtr
const & structure)
116 return NTUtils::is_a(structure->getID(), URI);
119 bool NTEnum::is_a(PVStructurePtr
const & pvStructure)
121 return is_a(pvStructure->getStructure());
124 bool NTEnum::isCompatible(StructureConstPtr
const &structure)
133 .has<&NTField::isEnumerated, Structure>(
"value")
135 .maybeHas<&NTField::isAlarm, Structure>(
"alarm")
136 .
maybeHas<&NTField::isTimeStamp, Structure>(
"timeStamp")
140 bool NTEnum::isCompatible(PVStructurePtr
const & pvStructure)
142 if(!pvStructure)
return false;
144 return isCompatible(pvStructure->getStructure());
147 bool NTEnum::isValid()
157 bool NTEnum::attachTimeStamp(PVTimeStamp &pvTimeStamp)
const 159 PVStructurePtr ts = getTimeStamp();
161 return pvTimeStamp.attach(ts);
166 bool NTEnum::attachAlarm(PVAlarm &pvAlarm)
const 168 PVStructurePtr al = getAlarm();
170 return pvAlarm.attach(al);
175 PVStructurePtr NTEnum::getPVStructure()
const 180 PVStringPtr NTEnum::getDescriptor()
const 182 return pvNTEnum->getSubField<PVString>(
"descriptor");
185 PVStructurePtr NTEnum::getTimeStamp()
const 187 return pvNTEnum->getSubField<PVStructure>(
"timeStamp");
190 PVStructurePtr NTEnum::getAlarm()
const 192 return pvNTEnum->getSubField<PVStructure>(
"alarm");
195 PVStructurePtr NTEnum::getValue()
const 200 NTEnum::NTEnum(PVStructurePtr
const & pvStructure) :
201 pvNTEnum(pvStructure), pvValue(pvNTEnum->getSubField<PVStructure>(
"value"))
std::tr1::shared_ptr< detail::NTEnumBuilder > NTEnumBuilderPtr
Convenience Class for NTEnum.
Result & maybeHas(const std::string &name)
Validation methods for NT types.
std::tr1::shared_ptr< NTField > NTFieldPtr
Interface for in-line creating of NTEnum.
std::tr1::shared_ptr< NTEnum > NTEnumPtr