10 #define epicsExportSharedSymbols 17 namespace epics {
namespace nt {
23 NTTableBuilder::shared_pointer NTTableBuilder::addColumn(
24 std::string
const & name, epics::pvData::ScalarType scalarType
27 if (std::find(columnNames.begin(), columnNames.end(), name) != columnNames.end())
28 throw std::runtime_error(
"duplicate column name");
30 columnNames.push_back(name);
31 types.push_back(scalarType);
33 return shared_from_this();
36 StructureConstPtr NTTableBuilder::createStructure()
38 FieldBuilderPtr builder = getFieldCreate()->createFieldBuilder();
40 FieldBuilderPtr nestedBuilder =
43 addArray(
"labels", pvString)->
44 addNestedStructure(
"value");
46 vector<string>::size_type len = columnNames.size();
47 for (vector<string>::size_type i = 0; i < len; i++)
48 nestedBuilder->addArray(columnNames[i], types[i]);
50 builder = nestedBuilder->endNested();
53 builder->add(
"descriptor", pvString);
56 builder->add(
"alarm", ntField->createAlarm());
59 builder->add(
"timeStamp", ntField->createTimeStamp());
61 size_t extraCount = extraFieldNames.size();
62 for (
size_t i = 0; i< extraCount; i++)
63 builder->add(extraFieldNames[i], extraFields[i]);
65 StructureConstPtr s = builder->createStructure();
71 NTTableBuilder::shared_pointer NTTableBuilder::addDescriptor()
74 return shared_from_this();
77 NTTableBuilder::shared_pointer NTTableBuilder::addAlarm()
80 return shared_from_this();
83 NTTableBuilder::shared_pointer NTTableBuilder::addTimeStamp()
86 return shared_from_this();
89 PVStructurePtr NTTableBuilder::createPVStructure()
92 size_t len = columnNames.size();
93 shared_vector<string> l(len);
94 for(
size_t i=0; i<len; ++i) l[i] = columnNames[i];
95 PVStructurePtr s = getPVDataCreate()->createPVStructure(createStructure());
96 s->getSubField<PVStringArray>(
"labels")->replace(freeze(l));
105 NTTableBuilder::NTTableBuilder()
110 void NTTableBuilder::reset()
119 NTTableBuilder::shared_pointer NTTableBuilder::add(
string const & name, FieldConstPtr
const & field)
121 extraFields.push_back(field); extraFieldNames.push_back(name);
122 return shared_from_this();
128 const std::string NTTable::URI(
"epics:nt/NTTable:1.0");
130 NTTable::shared_pointer NTTable::wrap(PVStructurePtr
const & pvStructure)
132 if(!isCompatible(pvStructure))
return shared_pointer();
133 return wrapUnsafe(pvStructure);
136 NTTable::shared_pointer NTTable::wrapUnsafe(PVStructurePtr
const & pvStructure)
138 return shared_pointer(
new NTTable(pvStructure));
141 bool NTTable::is_a(StructureConstPtr
const & structure)
143 return NTUtils::is_a(structure->getID(), URI);
146 bool NTTable::is_a(PVStructurePtr
const & pvStructure)
148 return is_a(pvStructure->getStructure());
151 bool NTTable::isCompatible(StructureConstPtr
const & structure)
160 .has<Structure>(
"value")
161 .
has<ScalarArray>(
"labels")
162 .maybeHas<Scalar>(
"descriptor")
163 .
maybeHas<&NTField::isAlarm, Structure>(
"alarm")
164 .maybeHas<&NTField::isTimeStamp, Structure>(
"timeStamp");
166 StructureConstPtr value(structure->getField<Structure>(
"value"));
169 StringArray
const & names(value->getFieldNames());
170 StringArray::const_iterator it;
172 for (it = names.begin(); it != names.end(); ++it)
173 r.
has<ScalarArray>(*it);
178 return result.
valid();
181 bool NTTable::isCompatible(PVStructurePtr
const & pvStructure)
183 if(!pvStructure)
return false;
185 return isCompatible(pvStructure->getStructure());
188 bool NTTable::isValid()
190 PVFieldPtrArray
const & columns = pvValue->getPVFields();
192 if (getLabels()->getLength() != columns.size())
return false;
195 for (PVFieldPtrArray::const_iterator it = columns.begin();
196 it != columns.end();++it)
198 PVScalarArrayPtr column = std::tr1::dynamic_pointer_cast<PVScalarArray>(*it);
199 if (!column.get())
return false;
200 int colLength = column->getLength();
206 else if (length != colLength)
219 bool NTTable::attachTimeStamp(PVTimeStamp &pvTimeStamp)
const 221 PVStructurePtr ts = getTimeStamp();
223 return pvTimeStamp.attach(ts);
228 bool NTTable::attachAlarm(PVAlarm &pvAlarm)
const 230 PVStructurePtr al = getAlarm();
232 return pvAlarm.attach(al);
237 PVStructurePtr NTTable::getPVStructure()
const 242 PVStringPtr NTTable::getDescriptor()
const 244 return pvNTTable->getSubField<PVString>(
"descriptor");
247 PVStructurePtr NTTable::getTimeStamp()
const 249 return pvNTTable->getSubField<PVStructure>(
"timeStamp");
252 PVStructurePtr NTTable::getAlarm()
const 254 return pvNTTable->getSubField<PVStructure>(
"alarm");
257 PVStringArrayPtr NTTable::getLabels()
const 259 return pvNTTable->getSubField<PVStringArray>(
"labels");
262 StringArray
const & NTTable::getColumnNames()
const 264 return pvValue->getStructure()->getFieldNames();
267 PVFieldPtr NTTable::getColumn(std::string
const & columnName)
const 269 return pvValue->getSubField(columnName);
272 NTTable::NTTable(PVStructurePtr
const & pvStructure) :
273 pvNTTable(pvStructure), pvValue(pvNTTable->getSubField<PVStructure>(
"value"))
std::tr1::shared_ptr< detail::NTTableBuilder > NTTableBuilderPtr
Result & maybeHas(const std::string &name)
Validation methods for NT types.
std::tr1::shared_ptr< NTField > NTFieldPtr
Result & has(const std::string &name)
std::tr1::shared_ptr< NTTable > NTTablePtr
Interface for in-line creating of NTTable.
Convenience Class for NTTable.