diff --git a/src/ntaggregate.cpp b/src/ntaggregate.cpp index cdd126c..c4deda6 100644 --- a/src/ntaggregate.cpp +++ b/src/ntaggregate.cpp @@ -4,6 +4,8 @@ * found in the file LICENSE that is included with the distribution */ +#include "validator.h" + #define epicsExportSharedSymbols #include #include @@ -194,83 +196,26 @@ bool NTAggregate::is_a(PVStructurePtr const & pvStructure) bool NTAggregate::isCompatible(StructureConstPtr const &structure) { - if (structure.get() == 0) return false; - - ScalarConstPtr valueField = structure->getField("value"); - if (valueField.get() == 0 || valueField->getScalarType() != pvDouble) + if (!structure) return false; - ScalarConstPtr nField = structure->getField("N"); - if (nField.get() == 0 || nField->getScalarType() != pvLong) - return false; + Result result(structure); - FieldConstPtr field = structure->getField("dispersion"); - if (field.get()) - { - ScalarConstPtr dispersionField = structure->getField("dispersion"); - if (!dispersionField.get() || dispersionField->getScalarType() != pvDouble) - return false; - } - - field = structure->getField("first"); - if (field.get()) - { - ScalarConstPtr firstField = structure->getField("first"); - if (!firstField.get() || firstField->getScalarType() != pvDouble) - return false; - } - - field = structure->getField("firstTimeStamp"); - if (field.get() && !ntField->isTimeStamp(field)) - return false; - - field = structure->getField("last"); - if (field.get()) - { - ScalarConstPtr lastField = structure->getField("last"); - if (!lastField.get() || lastField->getScalarType() != pvDouble) - return false; - } - - field = structure->getField("lastTimeStamp"); - if (field.get() && !ntField->isTimeStamp(field)) - return false; - - field = structure->getField("max"); - if (field.get()) - { - ScalarConstPtr maxField = structure->getField("max"); - if (!maxField.get() || maxField->getScalarType() != pvDouble) - return false; - } - - field = structure->getField("min"); - if (field.get()) - { - ScalarConstPtr minField = structure->getField("min"); - if (!minField.get() || minField->getScalarType() != pvDouble) - return false; - } - - field = structure->getField("descriptor"); - if (field.get()) - { - ScalarConstPtr descriptorField = structure->getField("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() + .has("value") + .has("N") + .maybeHas("dispersion") + .maybeHas("first") + .maybeHas<&NTField::isTimeStamp, Structure>("firstTimeStamp") + .maybeHas("last") + .maybeHas<&NTField::isTimeStamp, Structure>("lastTimeStamp") + .maybeHas("max") + .maybeHas("min") + .maybeHas("descriptor") + .maybeHas<&NTField::isAlarm, Structure>("alarm") + .maybeHas<&NTField::isTimeStamp, Structure>("timeStamp") + .valid(); } bool NTAggregate::isCompatible(PVStructurePtr const & pvStructure) diff --git a/src/ntcontinuum.cpp b/src/ntcontinuum.cpp index 72c10f4..792217e 100644 --- a/src/ntcontinuum.cpp +++ b/src/ntcontinuum.cpp @@ -4,6 +4,8 @@ * found in the file LICENSE that is included with the distribution */ +#include "validator.h" + #define epicsExportSharedSymbols #include #include @@ -122,42 +124,22 @@ bool NTContinuum::is_a(PVStructurePtr const & pvStructure) bool NTContinuum::isCompatible(StructureConstPtr const & structure) { - if (structure.get() == 0) return false; - - ScalarArrayConstPtr baseField = structure->getField("base"); - if (baseField.get() == 0 || baseField->getElementType() != pvDouble) + if (!structure) return false; - ScalarArrayConstPtr valueField = structure->getField("value"); - if (valueField.get() == 0 || valueField->getElementType() != pvDouble) - return false; + Result result(structure); - ScalarArrayConstPtr unitsField = structure->getField("units"); - if (unitsField.get() == 0 || unitsField->getElementType() != pvString) - return false; - - FieldConstPtr field = structure->getField("descriptor"); - if (field.get()) - { - ScalarConstPtr descriptorField = structure->getField("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() + .has("base") + .has("value") + .has("units") + .maybeHas("descriptor") + .maybeHas<&NTField::isAlarm, Structure>("alarm") + .maybeHas<&NTField::isTimeStamp, Structure>("timeStamp") + .valid(); } - bool NTContinuum::isCompatible(PVStructurePtr const & pvStructure) { if(!pvStructure) return false; diff --git a/src/ntenum.cpp b/src/ntenum.cpp index bb9bd6c..6ac4f4e 100644 --- a/src/ntenum.cpp +++ b/src/ntenum.cpp @@ -4,6 +4,8 @@ * found in the file LICENSE that is included with the distribution */ +#include "validator.h" + #define epicsExportSharedSymbols #include #include @@ -121,34 +123,20 @@ bool NTEnum::is_a(PVStructurePtr const & pvStructure) bool NTEnum::isCompatible(StructureConstPtr const &structure) { - if (structure.get() == 0) return false; - - NTFieldPtr ntField = NTField::get(); - - FieldConstPtr valueField = structure->getField("value"); - if (!valueField.get() || !ntField->isEnumerated(valueField)) + if (!structure) return false; - FieldConstPtr field = structure->getField("descriptor"); - if (field.get()) - { - ScalarConstPtr descriptorField = structure->getField("descriptor"); - if (!descriptorField.get() || descriptorField->getScalarType() != pvString) - return false; - } + Result result(structure); - 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() + .has<&NTField::isEnumerated, Structure>("value") + .maybeHas("descriptor") + .maybeHas<&NTField::isAlarm, Structure>("alarm") + .maybeHas<&NTField::isTimeStamp, Structure>("timeStamp") + .valid(); } - bool NTEnum::isCompatible(PVStructurePtr const & pvStructure) { if(!pvStructure) return false; diff --git a/src/nthistogram.cpp b/src/nthistogram.cpp index 63c02c0..7c0ecdb 100644 --- a/src/nthistogram.cpp +++ b/src/nthistogram.cpp @@ -4,6 +4,8 @@ * found in the file LICENSE that is included with the distribution */ +#include "validator.h" + #define epicsExportSharedSymbols #include #include @@ -135,37 +137,19 @@ bool NTHistogram::is_a(PVStructurePtr const & pvStructure) bool NTHistogram::isCompatible(StructureConstPtr const &structure) { - if(!structure.get()) return false; - - ScalarArrayConstPtr rangesField = structure->getField("ranges"); - if(!rangesField.get() || rangesField->getElementType() != pvDouble) return false; - - ScalarArrayConstPtr valueField = structure->getField("value"); - if(!valueField.get()) return false; - - ScalarType scalarType = valueField->getElementType(); - if (scalarType != pvShort && - scalarType != pvInt && - scalarType != pvLong) + if (!structure) return false; - FieldConstPtr field = structure->getField("descriptor"); - if(field) - { - ScalarConstPtr descriptorField = structure->getField("descriptor"); - if (!descriptorField.get() || descriptorField->getScalarType() != pvString) - return false; - } + Result result(structure); - 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() + .has("ranges") + .has("value") + .maybeHas("descriptor") + .maybeHas<&NTField::isAlarm, Structure>("alarm") + .maybeHas<&NTField::isTimeStamp, Structure>("timeStamp") + .valid(); } bool NTHistogram::isCompatible(PVStructurePtr const & pvStructure) diff --git a/src/ntmatrix.cpp b/src/ntmatrix.cpp index bc2bfd4..090c905 100644 --- a/src/ntmatrix.cpp +++ b/src/ntmatrix.cpp @@ -4,6 +4,8 @@ * found in the file LICENSE that is included with the distribution */ +#include "validator.h" + #define epicsExportSharedSymbols #include #include @@ -139,43 +141,20 @@ bool NTMatrix::is_a(PVStructurePtr const & pvStructure) bool NTMatrix::isCompatible(StructureConstPtr const & structure) { - if (structure.get() == 0) return false; - - ScalarArrayConstPtr valueField = structure->getField("value"); - if (valueField.get() == 0 || valueField->getElementType() != pvDouble) + if (!structure) return false; - FieldConstPtr field = structure->getField("dim"); - if (field.get()) - { - ScalarArrayConstPtr dimField = structure->getField("dim"); - if (dimField.get() == 0 || dimField->getElementType() != pvInt) - return false; - } + Result result(structure); - field = structure->getField("descriptor"); - if (field.get()) - { - ScalarConstPtr descriptorField = structure->getField("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; - - field = structure->getField("display"); - if (field.get() && !ntField->isDisplay(field)) - return false; - - return true; + return result + .is() + .has("value") + .maybeHas("dim") + .maybeHas("descriptor") + .maybeHas<&NTField::isAlarm, Structure>("alarm") + .maybeHas<&NTField::isTimeStamp, Structure>("timeStamp") + .maybeHas<&NTField::isDisplay, Structure>("display") + .valid(); } bool NTMatrix::isCompatible(PVStructurePtr const & pvStructure) diff --git a/src/ntmultiChannel.cpp b/src/ntmultiChannel.cpp index 79d258c..c26f641 100644 --- a/src/ntmultiChannel.cpp +++ b/src/ntmultiChannel.cpp @@ -6,6 +6,8 @@ #include +#include "validator.h" + #define epicsExportSharedSymbols #include #include @@ -232,86 +234,27 @@ bool NTMultiChannel::is_a(PVStructurePtr const & pvStructure) bool NTMultiChannel::isCompatible(StructureConstPtr const & structure) { - if (!structure.get()) return false; - - UnionArrayConstPtr valueField = structure->getField("value"); - if (!valueField.get()) return false; - - ScalarArrayConstPtr channelNameField = structure->getField( - "channelName"); - if (!channelNameField.get()) return false; - if (channelNameField->getElementType() != pvString) return false; - - FieldConstPtr field = structure->getField("severity"); - if (field.get()) - { - ScalarArrayConstPtr severityField = structure->getField("severity"); - if (!severityField.get() || severityField->getElementType() != pvInt) - return false; - } - - field = structure->getField("status"); - if (field.get()) - { - ScalarArrayConstPtr statusField = structure->getField("status"); - if (!statusField.get() || statusField->getElementType() != pvInt) - return false; - } - - field = structure->getField("message"); - if (field.get()) - { - ScalarArrayConstPtr messageField = structure->getField("message"); - if (!messageField.get() || messageField->getElementType() != pvString) - return false; - } - - field = structure->getField("secondsPastEpoch"); - if (field.get()) - { - ScalarArrayConstPtr secondsPastEpochField = structure->getField("secondsPastEpoch"); - if (!secondsPastEpochField.get() || secondsPastEpochField->getElementType() != pvLong) - return false; - } - - field = structure->getField("nanoseconds"); - if (field.get()) - { - ScalarArrayConstPtr nanosecondsField = structure->getField("nanoseconds"); - if (!nanosecondsField.get() || nanosecondsField->getElementType() != pvInt) - return false; - } - - field = structure->getField("userTag"); - if (field.get()) - { - ScalarArrayConstPtr userTagField = structure->getField("userTag"); - if (!userTagField.get() || userTagField->getElementType() != pvInt) - return false; - } - - field = structure->getField("descriptor"); - if (field.get()) - { - ScalarConstPtr descriptorField = structure->getField("descriptor"); - if (!descriptorField.get() || descriptorField->getScalarType() != pvString) - return false; - } - - NTFieldPtr ntField = NTField::get(); - - field = structure->getField("alarm"); - if (field.get() && !ntField->isAlarm(field)) + if (!structure) return false; - field = structure->getField("timeStamp"); - if (field.get() && !ntField->isTimeStamp(field)) - return false; + Result result(structure); - return true; + return result + .is() + .has("value") + .has("channelName") + .maybeHas("severity") + .maybeHas("status") + .maybeHas("message") + .maybeHas("secondsPastEpoch") + .maybeHas("nanoseconds") + .maybeHas("userTag") + .maybeHas("descriptor") + .maybeHas<&NTField::isAlarm, Structure>("alarm") + .maybeHas<&NTField::isTimeStamp, Structure>("timeStamp") + .valid(); } - bool NTMultiChannel::isCompatible(PVStructurePtr const &pvStructure) { if(!pvStructure.get()) return false; diff --git a/src/ntnameValue.cpp b/src/ntnameValue.cpp index 7f250ff..d34d6b9 100644 --- a/src/ntnameValue.cpp +++ b/src/ntnameValue.cpp @@ -4,6 +4,8 @@ * found in the file LICENSE that is included with the distribution */ +#include "validator.h" + #define epicsExportSharedSymbols #include #include @@ -134,35 +136,19 @@ bool NTNameValue::is_a(PVStructurePtr const & pvStructure) bool NTNameValue::isCompatible(StructureConstPtr const & structure) { - if (structure.get() == 0) return false; - - ScalarArrayConstPtr nameField = structure->getField("name"); - if (nameField.get() == 0 || nameField->getElementType() != pvString) + if (!structure) return false; - ScalarArrayConstPtr valueField = structure->getField("value"); - if (valueField.get() == 0) - return false; - - FieldConstPtr field = structure->getField("descriptor"); - if (field.get()) - { - ScalarConstPtr descriptorField = structure->getField("descriptor"); - if (!descriptorField || descriptorField->getScalarType() != pvString) - return false; - } - - NTFieldPtr ntField = NTField::get(); - - field = structure->getField("alarm"); - if (field && !ntField->isAlarm(field)) - return false; - - field = structure->getField("timeStamp"); - if (field && !ntField->isTimeStamp(field)) - return false; - - return true; + Result result(structure); + + return result + .is() + .has("name") + .has("value") + .maybeHas("descriptor") + .maybeHas<&NTField::isAlarm, Structure>("alarm") + .maybeHas<&NTField::isTimeStamp, Structure>("timeStamp") + .valid(); } bool NTNameValue::isCompatible(PVStructurePtr const & pvStructure) diff --git a/src/ntscalar.cpp b/src/ntscalar.cpp index b1685ee..afa4b32 100644 --- a/src/ntscalar.cpp +++ b/src/ntscalar.cpp @@ -4,6 +4,8 @@ * found in the file LICENSE that is included with the distribution */ +#include "validator.h" + #define epicsExportSharedSymbols #include #include @@ -152,42 +154,22 @@ bool NTScalar::is_a(PVStructurePtr const & pvStructure) bool NTScalar::isCompatible(StructureConstPtr const &structure) { - if (structure.get() == 0) return false; - - ScalarConstPtr valueField = structure->getField("value"); - if (valueField.get() == 0) + if (!structure) return false; - FieldConstPtr field = structure->getField("descriptor"); - if (field.get()) - { - ScalarConstPtr descriptorField = structure->getField("descriptor"); - if (!descriptorField.get() || descriptorField->getScalarType() != pvString) - return false; - } + Result result(structure); - 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; - - field = structure->getField("display"); - if (field.get() && !ntField->isDisplay(field)) - return false; - - field = structure->getField("control"); - if (field.get() && !ntField->isControl(field)) - return false; - - return true; + return result + .is() + .has("value") + .maybeHas("descriptor") + .maybeHas<&NTField::isAlarm, Structure>("alarm") + .maybeHas<&NTField::isTimeStamp, Structure>("timeStamp") + .maybeHas<&NTField::isDisplay, Structure>("display") + .maybeHas<&NTField::isControl, Structure>("control") + .valid(); } - bool NTScalar::isCompatible(PVStructurePtr const & pvStructure) { if(!pvStructure) return false; diff --git a/src/ntscalarArray.cpp b/src/ntscalarArray.cpp index bc748e7..3c82e42 100644 --- a/src/ntscalarArray.cpp +++ b/src/ntscalarArray.cpp @@ -4,6 +4,8 @@ * found in the file LICENSE that is included with the distribution */ +#include "validator.h" + #define epicsExportSharedSymbols #include #include @@ -161,39 +163,20 @@ bool NTScalarArray::is_a(PVStructurePtr const & pvStructure) bool NTScalarArray::isCompatible(StructureConstPtr const & structure) { - if (structure.get() == 0) return false; - - ScalarArrayConstPtr valueField = structure->getField("value"); - if (valueField.get() == 0) + if (!structure) return false; - FieldConstPtr field = structure->getField("descriptor"); - if (field.get()) - { - ScalarConstPtr descriptorField = structure->getField("descriptor"); - if (!descriptorField.get() || descriptorField->getScalarType() != pvString) - return false; - } + Result result(structure); - 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; - - field = structure->getField("display"); - if (field.get() && !ntField->isDisplay(field)) - return false; - - field = structure->getField("control"); - if (field.get() && !ntField->isControl(field)) - return false; - - return true; + return result + .is() + .has("value") + .maybeHas("descriptor") + .maybeHas<&NTField::isAlarm, Structure>("alarm") + .maybeHas<&NTField::isTimeStamp, Structure>("timeStamp") + .maybeHas<&NTField::isDisplay, Structure>("display") + .maybeHas<&NTField::isControl, Structure>("control") + .valid(); } bool NTScalarArray::isCompatible(PVStructurePtr const & pvStructure) diff --git a/src/ntscalarMultiChannel.cpp b/src/ntscalarMultiChannel.cpp index 474b337..69d2be7 100644 --- a/src/ntscalarMultiChannel.cpp +++ b/src/ntscalarMultiChannel.cpp @@ -4,6 +4,7 @@ * found in the file LICENSE that is included with the distribution */ #include +#include "validator.h" #define epicsExportSharedSymbols #include @@ -228,86 +229,27 @@ bool NTScalarMultiChannel::is_a(PVStructurePtr const & pvStructure) bool NTScalarMultiChannel::isCompatible(StructureConstPtr const & structure) { - if (!structure.get()) return false; - - ScalarArrayConstPtr valueField = structure->getField("value"); - if (!valueField.get()) return false; - - ScalarArrayConstPtr channelNameField = structure->getField( - "channelName"); - if (!channelNameField.get()) return false; - if (channelNameField->getElementType() != pvString) return false; - - FieldConstPtr field = structure->getField("severity"); - if (field.get()) - { - ScalarArrayConstPtr severityField = structure->getField("severity"); - if (!severityField.get() || severityField->getElementType() != pvInt) - return false; - } - - field = structure->getField("status"); - if (field.get()) - { - ScalarArrayConstPtr statusField = structure->getField("status"); - if (!statusField.get() || statusField->getElementType() != pvInt) - return false; - } - - field = structure->getField("message"); - if (field.get()) - { - ScalarArrayConstPtr messageField = structure->getField("message"); - if (!messageField.get() || messageField->getElementType() != pvString) - return false; - } - - field = structure->getField("secondsPastEpoch"); - if (field.get()) - { - ScalarArrayConstPtr secondsPastEpochField = structure->getField("secondsPastEpoch"); - if (!secondsPastEpochField.get() || secondsPastEpochField->getElementType() != pvLong) - return false; - } - - field = structure->getField("nanoseconds"); - if (field.get()) - { - ScalarArrayConstPtr nanosecondsField = structure->getField("nanoseconds"); - if (!nanosecondsField.get() || nanosecondsField->getElementType() != pvInt) - return false; - } - - field = structure->getField("userTag"); - if (field.get()) - { - ScalarArrayConstPtr userTagField = structure->getField("userTag"); - if (!userTagField.get() || userTagField->getElementType() != pvInt) - return false; - } - - field = structure->getField("descriptor"); - if (field.get()) - { - ScalarConstPtr descriptorField = structure->getField("descriptor"); - if (!descriptorField.get() || descriptorField->getScalarType() != pvString) - return false; - } - - NTFieldPtr ntField = NTField::get(); - - field = structure->getField("alarm"); - if (field.get() && !ntField->isAlarm(field)) + if (!structure) return false; - field = structure->getField("timeStamp"); - if (field.get() && !ntField->isTimeStamp(field)) - return false; + Result result(structure); - return true; + return result + .is() + .has("value") + .has("channelName") + .maybeHas("severity") + .maybeHas("status") + .maybeHas("message") + .maybeHas("secondsPastEpoch") + .maybeHas("nanoseconds") + .maybeHas("userTag") + .maybeHas("descriptor") + .maybeHas<&NTField::isAlarm, Structure>("alarm") + .maybeHas<&NTField::isTimeStamp, Structure>("timeStamp") + .valid(); } - bool NTScalarMultiChannel::isCompatible(PVStructurePtr const &pvStructure) { if(!pvStructure.get()) return false; diff --git a/src/nttable.cpp b/src/nttable.cpp index b26e0c7..458dd9d 100644 --- a/src/nttable.cpp +++ b/src/nttable.cpp @@ -5,6 +5,7 @@ */ #include +#include "validator.h" #define epicsExportSharedSymbols #include @@ -149,42 +150,32 @@ bool NTTable::is_a(PVStructurePtr const & pvStructure) bool NTTable::isCompatible(StructureConstPtr const & structure) { - if (!structure.get()) return false; - - StructureConstPtr valueField = structure->getField("value"); - if (!valueField.get()) + if (!structure) return false; - FieldConstPtrArray const & fields = valueField->getFields(); - for (FieldConstPtrArray::const_iterator it = fields.begin(); - it != fields.end(); ++it) - { - if ((*it)->getType() != scalarArray) return false; + Result result(structure); + + result + .is() + .has("value") + .has("labels") + .maybeHas("descriptor") + .maybeHas<&NTField::isAlarm, Structure>("alarm") + .maybeHas<&NTField::isTimeStamp, Structure>("timeStamp"); + + StructureConstPtr value(structure->getField("value")); + if (value) { + Result r(value); + StringArray const & names(value->getFieldNames()); + StringArray::const_iterator it; + + for (it = names.begin(); it != names.end(); ++it) + r.has(*it); + + result |= r; } - ScalarArrayConstPtr labelsField = structure->getField("labels"); - if (!labelsField.get() || labelsField->getElementType() != pvString) - return false; - - FieldConstPtr field = structure->getField("descriptor"); - if (field.get()) - { - ScalarConstPtr descriptorField = structure->getField("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.valid(); } bool NTTable::isCompatible(PVStructurePtr const & pvStructure) diff --git a/src/ntunion.cpp b/src/ntunion.cpp index bf055c8..91d5529 100644 --- a/src/ntunion.cpp +++ b/src/ntunion.cpp @@ -4,6 +4,8 @@ * found in the file LICENSE that is included with the distribution */ +#include "validator.h" + #define epicsExportSharedSymbols #include #include @@ -128,31 +130,18 @@ bool NTUnion::is_a(PVStructurePtr const & pvStructure) bool NTUnion::isCompatible(StructureConstPtr const &structure) { - if (structure.get() == 0) return false; - - UnionConstPtr valueField = structure->getField("value"); - if (valueField.get() == 0) + if (!structure) return false; - FieldConstPtr field = structure->getField("descriptor"); - if (field.get()) - { - ScalarConstPtr descriptorField = structure->getField("descriptor"); - if (!descriptorField.get() || descriptorField->getScalarType() != pvString) - return false; - } + Result result(structure); - 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() + .has("value") + .maybeHas("descriptor") + .maybeHas<&NTField::isAlarm, Structure>("alarm") + .maybeHas<&NTField::isTimeStamp, Structure>("timeStamp") + .valid(); } bool NTUnion::isCompatible(PVStructurePtr const & pvStructure) diff --git a/src/nturi.cpp b/src/nturi.cpp index ca1b1f9..9bf9f8f 100644 --- a/src/nturi.cpp +++ b/src/nturi.cpp @@ -5,6 +5,7 @@ */ #include +#include "validator.h" #define epicsExportSharedSymbols #include @@ -149,45 +150,31 @@ bool NTURI::is_a(PVStructurePtr const & pvStructure) bool NTURI::isCompatible(StructureConstPtr const & structure) { - if (!structure.get()) return false; - - ScalarConstPtr schemeField = structure->getField("scheme"); - if (schemeField.get() == 0 || schemeField->getScalarType() != pvString) + if (!structure) return false; - ScalarConstPtr pathField = structure->getField("path"); - if (pathField.get() == 0 || pathField->getScalarType() != pvString) - return false; + Result result(structure); - FieldConstPtr field = structure->getField("authority"); - if (field.get()) - { - ScalarConstPtr authorityField = structure->getField("authority"); - if (!authorityField.get() || authorityField->getScalarType() != pvString) - return false; + result + .is() + .has("scheme") + .has("path") + .maybeHas("authority") + .maybeHas("query"); + + StructureConstPtr query(structure->getField("query")); + if (query) { + Result r(query); + StringArray const & names(query->getFieldNames()); + StringArray::const_iterator it; + + for (it = names.begin(); it != names.end(); ++it) + r.has(*it); + + result |= r; } - field = structure->getField("query"); - if (field.get()) - { - StructureConstPtr queryField = structure->getField("query"); - if (!queryField.get()) - return false; - - FieldConstPtrArray const & fields = queryField->getFields(); - for (FieldConstPtrArray::const_iterator it = fields.begin(); - it != fields.end(); ++it) - { - if ((*it)->getType() != scalar) return false; - ScalarType scalarType = std::tr1::dynamic_pointer_cast( - (*it))->getScalarType(); - if (scalarType != pvString && - scalarType != pvInt && - scalarType != pvDouble) return false; - } - } - - return true; + return result.valid(); } diff --git a/src/pv/ntfield.h b/src/pv/ntfield.h index 7a51e58..e79cf3e 100644 --- a/src/pv/ntfield.h +++ b/src/pv/ntfield.h @@ -160,9 +160,21 @@ private: static Result& isAlarmLimit(Result&); static Result& isControl(Result&); + friend class NTAggregate; friend class NTAttribute; + friend class NTContinuum; + friend class NTEnum; + friend class NTHistogram; + friend class NTMatrix; + friend class NTMultiChannel; + friend class NTNameValue; friend class NTNDArray; friend class NTNDArrayAttribute; + friend class NTScalar; + friend class NTScalarArray; + friend class NTScalarMultiChannel; + friend class NTTable; + friend class NTUnion; }; /**