diff --git a/src/pv/pvaClient.h b/src/pv/pvaClient.h index 3c972ca..b908518 100644 --- a/src/pv/pvaClient.h +++ b/src/pv/pvaClient.h @@ -687,6 +687,9 @@ public: * @return The timeStamp. */ epics::pvData::TimeStamp getTimeStamp(); + /** @brief set length of all array fields to 0 + */ + void zeroArrayLength(); /** @brief Factory method for creating an instance of PvaClientData. * * NOTE: Not normally called by clients @@ -706,6 +709,7 @@ private: void parse( const std::string &arg, const epics::pvData::PVUnionPtr &dest); + void zeroArrayLength(const epics::pvData::PVStructurePtr &pvStructure); epics::pvData::StructureConstPtr structure; epics::pvData::PVStructurePtr pvStructure; diff --git a/src/pvaClientData.cpp b/src/pvaClientData.cpp index ed3eced..32acd1b 100644 --- a/src/pvaClientData.cpp +++ b/src/pvaClientData.cpp @@ -155,7 +155,6 @@ void PvaClientData::parse(const std::vector &args) { if(!pvStructure) throw std::runtime_error(messagePrefix + noStructure); if(!bitSet) throw std::runtime_error(messagePrefix + noStructure); - bitSet->clear(); size_t num = args.size(); for(size_t i=0; i &args) bitSet->set(pvUnion->getFieldOffset()); return; } - PVScalarArrayPtr pvScalarArray(pvStructure->getSubField(field)); - if(pvScalarArray) pvScalarArray->setLength(0); parse(rest,pvField,bitSet); } } @@ -449,4 +446,42 @@ TimeStamp PvaClientData::getTimeStamp() throw std::runtime_error(messagePrefix + noTimeStamp); } +void PvaClientData::zeroArrayLength() +{ + if(!pvStructure) throw new std::runtime_error(messagePrefix + noStructure); + zeroArrayLength(pvStructure); +} + +void PvaClientData::zeroArrayLength(const epics::pvData::PVStructurePtr &pvStructure) +{ +const PVFieldPtrArray pvFields(pvStructure->getPVFields()); + for(size_t i=0; igetField()->getType()); + switch(type) { + case epics::pvData::scalarArray: + { + PVScalarArrayPtr pvScalarArray = static_pointer_cast(pvField); + pvScalarArray->setLength(0); + } + break; + case epics::pvData::structureArray: + { + PVStructureArrayPtr pvStructureArray = static_pointer_cast(pvField); + pvStructureArray->setLength(0); + } + break; + case epics::pvData::structure: + { + PVStructurePtr pvStructure = static_pointer_cast(pvField); + zeroArrayLength(pvStructure); + } + break; + default: + break; + } + } +} + + }}