Add isValid() implementations
for NTMultiChannel, NTScalarMultiChannel, NTTable and NTURI.
This commit is contained in:
@@ -318,12 +318,34 @@ bool NTMultiChannel::isCompatible(PVStructurePtr const &pvStructure)
|
||||
return isCompatible(pvStructure->getStructure());
|
||||
}
|
||||
|
||||
|
||||
bool NTMultiChannel::isValid()
|
||||
{
|
||||
size_t valueLength = getValue()->getLength();
|
||||
if (getChannelName()->getLength() != valueLength) return false;
|
||||
|
||||
PVScalarArrayPtr arrayFields[] = {
|
||||
getSeverity(), getStatus(), getMessage(),
|
||||
getSecondsPastEpoch(), getNanoseconds(), getUserTag()
|
||||
};
|
||||
size_t N = sizeof(arrayFields)/sizeof(arrayFields[0]);
|
||||
|
||||
PVScalarArrayPtr arrayField;
|
||||
for (PVScalarArrayPtr * pa = arrayFields; pa != arrayFields+N; ++pa)
|
||||
{
|
||||
arrayField = *pa;
|
||||
if (arrayField.get() && arrayField->getLength() != valueLength)
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
NTMultiChannelBuilderPtr NTMultiChannel::createBuilder()
|
||||
{
|
||||
return NTMultiChannelBuilderPtr(new detail::NTMultiChannelBuilder());
|
||||
}
|
||||
|
||||
|
||||
NTMultiChannel::NTMultiChannel(PVStructurePtr const & pvStructure)
|
||||
: pvNTMultiChannel(pvStructure),
|
||||
pvTimeStamp(pvStructure->getSubField<PVStructure>("timeStamp")),
|
||||
|
||||
@@ -315,6 +315,27 @@ bool NTScalarMultiChannel::isCompatible(PVStructurePtr const &pvStructure)
|
||||
return isCompatible(pvStructure->getStructure());
|
||||
}
|
||||
|
||||
bool NTScalarMultiChannel::isValid()
|
||||
{
|
||||
size_t valueLength = getValue()->getLength();
|
||||
if (getChannelName()->getLength() != valueLength) return false;
|
||||
|
||||
PVScalarArrayPtr arrayFields[] = {
|
||||
getSeverity(), getStatus(), getMessage(),
|
||||
getSecondsPastEpoch(), getNanoseconds(), getUserTag()
|
||||
};
|
||||
size_t N = sizeof(arrayFields)/sizeof(arrayFields[0]);
|
||||
|
||||
PVScalarArrayPtr arrayField;
|
||||
for (PVScalarArrayPtr * pa = arrayFields; pa != arrayFields+N; ++pa)
|
||||
{
|
||||
arrayField = *pa;
|
||||
if (arrayField.get() && arrayField->getLength() != valueLength)
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
NTScalarMultiChannelBuilderPtr NTScalarMultiChannel::createBuilder()
|
||||
{
|
||||
return NTScalarMultiChannelBuilderPtr(new detail::NTScalarMultiChannelBuilder());
|
||||
|
||||
@@ -190,6 +190,32 @@ bool NTTable::isCompatible(PVStructurePtr const & pvStructure)
|
||||
return isCompatible(pvStructure->getStructure());
|
||||
}
|
||||
|
||||
bool NTTable::isValid()
|
||||
{
|
||||
PVFieldPtrArray const & columns = pvValue->getPVFields();
|
||||
|
||||
if (getLabels()->getLength() != columns.size()) return false;
|
||||
boolean first = true;
|
||||
int length = 0;
|
||||
for (PVFieldPtrArray::const_iterator it = columns.begin();
|
||||
it != columns.end();++it)
|
||||
{
|
||||
PVScalarArrayPtr column = std::tr1::dynamic_pointer_cast<PVScalarArray>(*it);
|
||||
if (!column.get()) return false;
|
||||
int colLength = column->getLength();
|
||||
if (first)
|
||||
{
|
||||
length = colLength;
|
||||
first = false;
|
||||
}
|
||||
else if (length != colLength)
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
NTTableBuilderPtr NTTable::createBuilder()
|
||||
{
|
||||
return NTTableBuilderPtr(new detail::NTTableBuilder());
|
||||
|
||||
@@ -194,6 +194,11 @@ bool NTURI::isCompatible(PVStructurePtr const & pvStructure)
|
||||
return isCompatible(pvStructure->getStructure());
|
||||
}
|
||||
|
||||
bool NTURI::isValid()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
NTURIBuilderPtr NTURI::createBuilder()
|
||||
{
|
||||
return NTURIBuilderPtr(new detail::NTURIBuilder());
|
||||
|
||||
Reference in New Issue
Block a user