9 #define epicsExportSharedSymbols 16 namespace epics {
namespace nt {
23 NTUnionBuilder::shared_pointer NTUnionBuilder::value(UnionConstPtr unionType)
25 valueType = unionType;
26 return shared_from_this();
29 StructureConstPtr NTUnionBuilder::createStructure()
31 FieldBuilderPtr builder =
32 getFieldCreate()->createFieldBuilder()->
34 add(
"value", valueType);
37 builder->add(
"descriptor", pvString);
40 builder->add(
"alarm", ntField->createAlarm());
43 builder->add(
"timeStamp", ntField->createTimeStamp());
45 size_t extraCount = extraFieldNames.size();
46 for (
size_t i = 0; i< extraCount; i++)
47 builder->add(extraFieldNames[i], extraFields[i]);
50 StructureConstPtr s = builder->createStructure();
56 NTUnionBuilder::shared_pointer NTUnionBuilder::addDescriptor()
59 return shared_from_this();
62 NTUnionBuilder::shared_pointer NTUnionBuilder::addAlarm()
65 return shared_from_this();
68 NTUnionBuilder::shared_pointer NTUnionBuilder::addTimeStamp()
71 return shared_from_this();
74 PVStructurePtr NTUnionBuilder::createPVStructure()
76 return getPVDataCreate()->createPVStructure(createStructure());
84 NTUnionBuilder::NTUnionBuilder()
89 void NTUnionBuilder::reset()
91 valueType = getFieldCreate()->createVariantUnion();
95 extraFieldNames.clear();
99 NTUnionBuilder::shared_pointer NTUnionBuilder::add(
string const & name, FieldConstPtr
const & field)
101 extraFields.push_back(field); extraFieldNames.push_back(name);
102 return shared_from_this();
108 const std::string NTUnion::URI(
"epics:nt/NTUnion:1.0");
110 NTUnion::shared_pointer NTUnion::wrap(PVStructurePtr
const & pvStructure)
112 if(!isCompatible(pvStructure))
return shared_pointer();
113 return wrapUnsafe(pvStructure);
116 NTUnion::shared_pointer NTUnion::wrapUnsafe(PVStructurePtr
const & pvStructure)
118 return shared_pointer(
new NTUnion(pvStructure));
121 bool NTUnion::is_a(StructureConstPtr
const & structure)
123 return NTUtils::is_a(structure->getID(), URI);
126 bool NTUnion::is_a(PVStructurePtr
const & pvStructure)
128 return is_a(pvStructure->getStructure());
131 bool NTUnion::isCompatible(StructureConstPtr
const &structure)
142 .maybeHas<&NTField::isAlarm, Structure>(
"alarm")
143 .
maybeHas<&NTField::isTimeStamp, Structure>(
"timeStamp")
147 bool NTUnion::isCompatible(PVStructurePtr
const & pvStructure)
149 if(!pvStructure)
return false;
151 return isCompatible(pvStructure->getStructure());
154 bool NTUnion::isValid()
164 bool NTUnion::attachTimeStamp(PVTimeStamp &pvTimeStamp)
const 166 PVStructurePtr ts = getTimeStamp();
168 return pvTimeStamp.attach(ts);
173 bool NTUnion::attachAlarm(PVAlarm &pvAlarm)
const 175 PVStructurePtr al = getAlarm();
177 return pvAlarm.attach(al);
182 PVStructurePtr NTUnion::getPVStructure()
const 187 PVStringPtr NTUnion::getDescriptor()
const 189 return pvNTUnion->getSubField<PVString>(
"descriptor");
192 PVStructurePtr NTUnion::getTimeStamp()
const 194 return pvNTUnion->getSubField<PVStructure>(
"timeStamp");
197 PVStructurePtr NTUnion::getAlarm()
const 199 return pvNTUnion->getSubField<PVStructure>(
"alarm");
202 PVUnionPtr NTUnion::getValue()
const 207 NTUnion::NTUnion(PVStructurePtr
const & pvStructure) :
208 pvNTUnion(pvStructure), pvValue(pvNTUnion->getSubField<PVUnion>(
"value"))
Interface for in-line creating of NTUnion.
Convenience Class for NTUnion.
Result & maybeHas(const std::string &name)
Validation methods for NT types.
std::tr1::shared_ptr< NTField > NTFieldPtr
std::tr1::shared_ptr< NTUnion > NTUnionPtr
std::tr1::shared_ptr< detail::NTUnionBuilder > NTUnionBuilderPtr