10#define epicsExportSharedSymbols
15using namespace epics::pvData;
17namespace epics {
namespace nt {
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();
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();
74 return shared_from_this();
80 return shared_from_this();
86 return shared_from_this();
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));
105NTTableBuilder::NTTableBuilder()
110void NTTableBuilder::reset()
121 extraFields.push_back(field); extraFieldNames.push_back(name);
122 return shared_from_this();
138 return shared_pointer(
new NTTable(pvStructure));
148 return is_a(pvStructure->getStructure());
156 Result result(structure);
160 .has<Structure>(
"value")
161 .has<ScalarArray>(
"labels")
162 .maybeHas<Scalar>(
"descriptor")
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();
183 if(!pvStructure)
return false;
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)
223 return pvTimeStamp.attach(ts);
232 return pvAlarm.attach(al);
244 return pvNTTable->getSubField<PVString>(
"descriptor");
249 return pvNTTable->getSubField<PVStructure>(
"timeStamp");
254 return pvNTTable->getSubField<PVStructure>(
"alarm");
259 return pvNTTable->getSubField<PVStringArray>(
"labels");
264 return pvValue->getStructure()->getFieldNames();
269 return pvValue->getSubField(columnName);
272NTTable::NTTable(PVStructurePtr
const & pvStructure) :
273 pvNTTable(pvStructure), pvValue(pvNTTable->getSubField<PVStructure>(
"value"))
bool isAlarm(epics::pvData::FieldConstPtr const &field)
Convenience Class for NTTable.
epics::pvData::StringArray const & getColumnNames() const
epics::pvData::PVStringArrayPtr getLabels() const
static bool is_a(epics::pvData::StructureConstPtr const &structure)
epics::pvData::PVStringPtr getDescriptor() const
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const
static bool isCompatible(epics::pvData::StructureConstPtr const &structure)
epics::pvData::PVStructurePtr getPVStructure() const
epics::pvData::PVStructurePtr getAlarm() const
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const &pvStructure)
static const std::string URI
epics::pvData::PVStructurePtr getTimeStamp() const
static NTTableBuilderPtr createBuilder()
static shared_pointer wrap(epics::pvData::PVStructurePtr const &pvStructure)
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const
epics::pvData::PVFieldPtr getColumn(std::string const &columnName) const
static bool is_a(const std::string &u1, const std::string &u2)
Interface for in-line creating of NTTable.
epics::pvData::PVStructurePtr createPVStructure()
friend class ::epics::nt::NTTable
shared_pointer add(std::string const &name, epics::pvData::FieldConstPtr const &field)
epics::pvData::StructureConstPtr createStructure()
shared_pointer addAlarm()
shared_pointer addColumn(std::string const &name, epics::pvData::ScalarType elementType)
shared_pointer addTimeStamp()
shared_pointer addDescriptor()
std::tr1::shared_ptr< detail::NTTableBuilder > NTTableBuilderPtr
std::tr1::shared_ptr< NTField > NTFieldPtr
std::tr1::shared_ptr< NTTable > NTTablePtr