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"); }
std::tr1::shared_ptr<PVCopy> PVCopy::create( PVRecord &pvRecord, PVStructure &request, String structureName) { PVStructure *pvRequest = &request; if(structureName.length()>0) { if(pvRequest->getStructure()->getNumberFields()>0) { PVStructure *pvStructure = pvRequest->getStructureField(structureName); if(pvStructure==0) return std::tr1::shared_ptr<PVCopy>(); pvRequest = pvStructure; } } std::tr1::shared_ptr<PVCopy> pvCopy = std::tr1::shared_ptr<PVCopy>(new PVCopy(pvRecord)); PVStructure *pvStruct = pvRequest; if(pvRequest->getSubField("field")!=0) { pvStruct = pvRequest->getStructureField("field"); } pvCopy->init(*pvStruct); return pvCopy; }