PVRecordFieldPtr PVRecord::findPVRecordField( PVRecordStructurePtr const & pvrs, PVFieldPtr const & pvField) { size_t desiredOffset = pvField->getFieldOffset(); PVFieldPtr pvf = pvrs->getPVField(); size_t offset = pvf->getFieldOffset(); if(offset==desiredOffset) return pvrs; PVRecordFieldPtrArrayPtr pvrfpap = pvrs->getPVRecordFields(); PVRecordFieldPtrArray::iterator iter; for (iter = pvrfpap.get()->begin(); iter!=pvrfpap.get()->end(); iter++ ) { PVRecordFieldPtr pvrf = *iter; pvf = pvrf->getPVField(); offset = pvf->getFieldOffset(); if(offset==desiredOffset) return pvrf; size_t nextOffset = pvf->getNextFieldOffset(); if(nextOffset<=desiredOffset) continue; return findPVRecordField( static_pointer_cast<PVRecordStructure>(pvrf), pvField); } throw std::logic_error( recordName + " pvField " + pvField->getFieldName() + " not in PVRecord"); }
PVFieldPtr PVStructure::getSubField(size_t fieldOffset) const { if(fieldOffset<=getFieldOffset()) { return nullPVField; } if(fieldOffset>getNextFieldOffset()) return nullPVField; size_t numFields = pvFields.size(); for(size_t i=0; i<numFields; i++) { PVFieldPtr pvField = pvFields[i]; if(pvField->getFieldOffset()==fieldOffset) return pvFields[i]; if(pvField->getNextFieldOffset()<=fieldOffset) continue; if(pvField->getField()->getType()==structure) { PVStructure *pvStructure = static_cast<PVStructure *>(pvField.get()); return pvStructure->getSubField(fieldOffset); } } throw std::logic_error("PVStructure.getSubField: Logic error"); }