Use Validator API for ntattribute and ntndarrayattribute

This commit is contained in:
Bruno Martins
2019-05-28 10:17:30 -04:00
committed by mdavidsaver
parent 24489f6535
commit 3a178ea5c4
5 changed files with 41 additions and 67 deletions

View File

@ -4,6 +4,8 @@
* found in the file LICENSE that is included with the distribution
*/
#include "validator.h"
#define epicsExportSharedSymbols
#include <pv/ntattribute.h>
#include <pv/ntutils.h>
@ -130,46 +132,22 @@ bool NTAttribute::is_a(PVStructurePtr const & pvStructure)
bool NTAttribute::isCompatible(StructureConstPtr const & structure)
{
if (structure.get() == 0) return false;
ScalarConstPtr nameField = structure->getField<Scalar>("name");
if (nameField.get() == 0 || nameField->getScalarType() != pvString)
if (!structure)
return false;
UnionConstPtr valueField = structure->getField<Union>("value");
if (valueField.get() == 0 || !valueField->isVariant())
return false;
Result result(structure);
FieldConstPtr field = structure->getField("tags");
if (field.get())
{
ScalarArrayConstPtr tagsField = structure->getField<ScalarArray>("tags");
if (tagsField.get() == 0 || tagsField->getElementType() != pvString)
return false;
}
field = structure->getField("descriptor");
if (field.get())
{
ScalarConstPtr descriptorField = structure->getField<Scalar>("descriptor");
if (!descriptorField.get() || descriptorField->getScalarType() != pvString)
return false;
}
NTFieldPtr ntField = NTField::get();
field = structure->getField("alarm");
if (field.get() && !ntField->isAlarm(field))
return false;
field = structure->getField("timeStamp");
if (field.get() && !ntField->isTimeStamp(field))
return false;
return true;
return result
.is<Structure>()
.has<Scalar>("name")
.has<Union>("value")
.maybeHas<ScalarArray>("tags")
.maybeHas<Scalar>("descriptor")
.maybeHas<&NTField::isAlarm, Structure>("alarm")
.maybeHas<&NTField::isTimeStamp, Structure>("timeStamp")
.valid();
}
bool NTAttribute::isCompatible(PVStructurePtr const & pvStructure)
{
if(!pvStructure) return false;

View File

@ -250,19 +250,6 @@ namespace {
.has<Scalar>("binning")
.has<Scalar>("reverse");
}
// TODO: move to NTNDArrayAttribute
Result& isAttribute(Result& result)
{
return result
.is<StructureArray>()
.has<Scalar>("name")
.has<Union>("value")
.maybeHas<ScalarArray>("tags")
.has<Scalar>("descriptor")
.maybeHas<&NTField::isAlarm>("alarm")
.maybeHas<&NTField::isTimeStamp>("timeStamp");
}
}
bool NTNDArray::isCompatible(StructureConstPtr const &structure)
@ -280,12 +267,12 @@ bool NTNDArray::isCompatible(StructureConstPtr const &structure)
.has<Scalar>("uncompressedSize")
.has<&isDimension>("dimension")
.has<Scalar>("uniqueId")
.has<&NTField::isTimeStamp>("dataTimeStamp")
.has<&isAttribute>("attribute")
.has<&NTField::isTimeStamp, Structure>("dataTimeStamp")
.has<&NTNDArrayAttribute::isAttribute, StructureArray>("attribute")
.maybeHas<Scalar>("descriptor")
.maybeHas<&NTField::isAlarm>("alarm")
.maybeHas<&NTField::isTimeStamp>("timeStamp")
.maybeHas<&NTField::isDisplay>("display")
.maybeHas<&NTField::isAlarm, Structure>("alarm")
.maybeHas<&NTField::isTimeStamp, Structure>("timeStamp")
.maybeHas<&NTField::isDisplay, Structure>("display")
.valid();
}

View File

@ -4,6 +4,8 @@
* found in the file LICENSE that is included with the distribution
*/
#include "validator.h"
#define epicsExportSharedSymbols
#include <pv/ntndarrayAttribute.h>
#include <pv/ntattribute.h>
@ -132,24 +134,25 @@ bool NTNDArrayAttribute::is_a(PVStructurePtr const & pvStructure)
return is_a(pvStructure->getStructure());
}
Result& NTNDArrayAttribute::isAttribute(Result& result) {
return result
.has<Scalar>("name")
.has<Union>("value")
.maybeHas<ScalarArray>("tags")
.has<Scalar>("descriptor")
.maybeHas<&NTField::isAlarm, Structure>("alarm")
.maybeHas<&NTField::isTimeStamp, Structure>("timeStamp")
.has<Scalar>("sourceType")
.has<Scalar>("source");
}
bool NTNDArrayAttribute::isCompatible(StructureConstPtr const & structure)
{
if (!NTAttribute::isCompatible(structure)) return false;
// descriptor required field for attibute in an ndarray
ScalarConstPtr descriptorField = structure->getField<Scalar>("descriptor");
if (descriptorField.get() == 0 || descriptorField->getScalarType() != pvString)
if (!structure)
return false;
ScalarConstPtr sourcedTypeField = structure->getField<Scalar>("sourceType");
if (sourcedTypeField.get() == 0 || sourcedTypeField->getScalarType() != pvInt)
return false;
ScalarConstPtr sourcedField = structure->getField<Scalar>("source");
if (sourcedField.get() == 0 || sourcedField->getScalarType() != pvString)
return false;
return true;
Result result(structure);
return isAttribute(result.is<Structure>()).valid();
}
bool NTNDArrayAttribute::isCompatible(PVStructurePtr const & pvStructure)

View File

@ -160,7 +160,9 @@ private:
static Result& isAlarmLimit(Result&);
static Result& isControl(Result&);
friend class NTAttribute;
friend class NTNDArray;
friend class NTNDArrayAttribute;
};
/**

View File

@ -22,6 +22,7 @@
namespace epics { namespace nt {
class Result;
class NTNDArrayAttribute;
typedef std::tr1::shared_ptr<NTNDArrayAttribute> NTNDArrayAttributePtr;
@ -302,10 +303,13 @@ public:
private:
NTNDArrayAttribute(epics::pvData::PVStructurePtr const & pvStructure);
static Result& isAttribute(Result& result);
epics::pvData::PVStructurePtr pvNTNDArrayAttribute;
epics::pvData::PVUnionPtr pvValue;
friend class detail::NTNDArrayAttributeBuilder;
friend class NTNDArray;
};
}}