From fb6f4355f38a590e061b992c8ecfdfbe6589ce7f Mon Sep 17 00:00:00 2001 From: mrkraimer Date: Tue, 9 Apr 2019 06:19:14 -0400 Subject: [PATCH] getDoubleArray and putDoubleArray now work for all numeric scalar arrays --- src/pvaClientData.cpp | 25 +++++++++++++------------ src/pvaClientPutData.cpp | 23 +++++++++++------------ 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/pvaClientData.cpp b/src/pvaClientData.cpp index 8178397..129b4cb 100644 --- a/src/pvaClientData.cpp +++ b/src/pvaClientData.cpp @@ -248,19 +248,16 @@ string PvaClientData::getString() shared_vector PvaClientData::getDoubleArray() { if(PvaClient::getDebug()) cout << "PvaClientData::getDoubleArray\n"; - PVDoubleArrayPtr pvDoubleArray; + PVScalarArrayPtr pvScalarArray; PVStructurePtr pvStructure = getPVStructure(); PVFieldPtr pvValue = pvStructure->getSubField("value"); if(pvValue) { Type type = pvValue->getField()->getType(); if(type==scalarArray) { PVScalarArrayPtr pvScalarArray = static_pointer_cast(pvValue); - if(pvScalarArray->getScalarArray()->getElementType()==pvDouble) { - pvDoubleArray = static_pointer_cast(pvValue); - } } } - if(!pvDoubleArray) { + if(!pvScalarArray) { while(true) { const PVFieldPtrArray fieldPtrArray(pvStructure->getPVFields()); if(fieldPtrArray.size()!=1) { @@ -270,21 +267,25 @@ shared_vector PvaClientData::getDoubleArray() PVFieldPtr pvField(fieldPtrArray[0]); Type type = pvField->getField()->getType(); if(type==scalarArray) { - PVScalarArrayPtr pvScalarArray = static_pointer_cast(pvField); - if(pvScalarArray->getScalarArray()->getElementType()==pvDouble) { - pvDoubleArray = static_pointer_cast(pvField); - break; - } + pvScalarArray = static_pointer_cast(pvField); + break; } if(pvField->getField()->getType()!=epics::pvData::structure) break; pvStructure = static_pointer_cast(pvField); } } - if(!pvDoubleArray) { + if(!pvScalarArray) { throw std::logic_error( "PvaClientData::getDoubleArray() did not find a scalarArray field"); } - return pvDoubleArray->view(); + ScalarType scalarType = pvScalarArray->getScalarArray()->getElementType(); + if(!ScalarTypeFunc::isNumeric(scalarType)) { + throw std::logic_error( + "PvaClientData::getDoubleArray() did not find a numeric scalarArray field"); + } + shared_vector retValue; + pvScalarArray->getAs(retValue); + return retValue; } shared_vector PvaClientData::getStringArray() diff --git a/src/pvaClientPutData.cpp b/src/pvaClientPutData.cpp index a0d3cc1..e1cf019 100644 --- a/src/pvaClientPutData.cpp +++ b/src/pvaClientPutData.cpp @@ -152,19 +152,16 @@ void PvaClientPutData::putString(std::string const & value) void PvaClientPutData::putDoubleArray(shared_vector const & value) { if(PvaClient::getDebug()) cout << "PvaClientPutData::putDoubleArray\n"; - PVDoubleArrayPtr pvDoubleArray; + PVScalarArrayPtr pvScalarArray; PVStructurePtr pvStructure = getPVStructure(); PVFieldPtr pvValue = pvStructure->getSubField("value"); if(pvValue) { Type type = pvValue->getField()->getType(); if(type==scalarArray) { - PVScalarArrayPtr pvScalarArray = static_pointer_cast(pvValue); - if(pvScalarArray->getScalarArray()->getElementType()==pvDouble) { - pvDoubleArray = static_pointer_cast(pvValue); - } + pvScalarArray = static_pointer_cast(pvValue); } } - if(!pvDoubleArray) { + if(!pvScalarArray) { while(true) { const PVFieldPtrArray fieldPtrArray(pvStructure->getPVFields()); if(fieldPtrArray.size()!=1) { @@ -175,20 +172,22 @@ void PvaClientPutData::putDoubleArray(shared_vector const & value) Type type = pvField->getField()->getType(); if(type==scalarArray) { PVScalarArrayPtr pvScalarArray = static_pointer_cast(pvField); - if(pvScalarArray->getScalarArray()->getElementType()==pvDouble) { - pvDoubleArray = static_pointer_cast(pvField); - break; - } + break; } if(pvField->getField()->getType()!=epics::pvData::structure) break; pvStructure = static_pointer_cast(pvField); } } - if(!pvDoubleArray) { + if(!pvScalarArray) { throw std::logic_error( "PvaClientData::putDoubleArray() did not find a scalarArray field"); } - pvDoubleArray->replace(value); + ScalarType scalarType = pvScalarArray->getScalarArray()->getElementType(); + if(!ScalarTypeFunc::isNumeric(scalarType)) { + throw std::logic_error( + "PvaClientData::putDoubleArray() did not find a numeric scalarArray field"); + } + pvScalarArray->putFrom(value); } void PvaClientPutData::putStringArray(shared_vector const & value)