diff --git a/pvDataApp/factory/PVStructure.cpp b/pvDataApp/factory/PVStructure.cpp index 7e5b0a7..dc25165 100644 --- a/pvDataApp/factory/PVStructure.cpp +++ b/pvDataApp/factory/PVStructure.cpp @@ -130,6 +130,30 @@ PVFieldPtr PVStructure::getSubField(size_t fieldOffset) const throw std::logic_error("PVStructure.getSubField: Logic error"); } +void PVStructure::fixParentStructure() +{ + PVStructure *parent = getParent(); + if(parent==NULL) return; + StructureConstPtr parentStructure = parent->structurePtr; + String fieldName = getFieldName(); + size_t index = parentStructure->getFieldIndex(fieldName); + StringArray const &fieldNames = parentStructure->getFieldNames(); + size_t num = fieldNames.size(); + FieldConstPtrArray fields(num); + FieldConstPtrArray const & oldFields = parentStructure->getFields(); + for(size_t i=0; i< num; i++) { + if(i==index) { + fields[i] = structurePtr; + } else { + fields[i] = oldFields[i]; + } + } + FieldConstPtr field = getFieldCreate()->createStructure( + parentStructure->getID(),fieldNames,fields); + parent->replaceField(field); + parent->fixParentStructure(); +} + void PVStructure::appendPVField( String const &fieldName, PVFieldPtr const & pvField) @@ -146,6 +170,7 @@ void PVStructure::appendPVField( for(size_t i=0; isetParentAndName(this,fieldNames[i]); } + fixParentStructure(); } void PVStructure::appendPVFields( @@ -172,6 +197,7 @@ void PVStructure::appendPVFields( for(size_t i=0; isetParentAndName(this,names[i]); } + fixParentStructure(); } void PVStructure::removePVField(String const &fieldName) diff --git a/pvDataApp/pv/pvData.h b/pvDataApp/pv/pvData.h index 2480b8e..77e39cf 100644 --- a/pvDataApp/pv/pvData.h +++ b/pvDataApp/pv/pvData.h @@ -816,6 +816,7 @@ public: */ PVStructure(StructureConstPtr const & structure,PVFieldPtrArray const & pvFields); private: + void fixParentStructure(); static PVFieldPtr nullPVField; static PVBooleanPtr nullPVBoolean; static PVBytePtr nullPVByte; diff --git a/testApp/pv/testPVAppend.cpp b/testApp/pv/testPVAppend.cpp index 0f07dfe..2e6a9d2 100644 --- a/testApp/pv/testPVAppend.cpp +++ b/testApp/pv/testPVAppend.cpp @@ -121,6 +121,33 @@ static void testAppendMore(FILE * fd) fprintf(fd,"testAppendMore PASSED\n"); } +static void testAppendStructures(FILE * fd) +{ + if(debug) fprintf(fd,"\ntestAppendStructures\n"); + PVFieldPtrArray fields; + StringArray names; + PVStructurePtr pvParent = pvDataCreate->createPVStructure(names,fields); + PVFieldPtrArray topFields; + StringArray topNames; + PVStructurePtr pvTop = pvDataCreate->createPVStructure(topNames,topFields); + pvParent->appendPVField("top",pvTop); + PVFieldPtrArray valueFields; + StringArray valueNames; + PVStructurePtr pvValue = pvDataCreate->createPVStructure(valueNames,valueFields); + pvTop->appendPVField("value",pvValue); + PVFieldPtrArray indexFields; + StringArray indexNames; + PVStructurePtr pvIndex = pvDataCreate->createPVStructure(indexNames,indexFields); + pvValue->appendPVField("index",pvIndex); + builder.clear(); + pvParent->toString(&builder); + if(debug) fprintf(fd,"%s\n",builder.c_str()); + builder.clear(); + pvParent->getField()->toString(&builder); + if(debug) fprintf(fd,"field\n%s\n",builder.c_str()); + fprintf(fd,"testAppendStructures PASSED\n"); +} + static void append2(PVStructurePtr &pvStructure, const char *oneName,const char *twoName, const char *oneValue,const char *twoValue) @@ -193,6 +220,7 @@ int main(int argc,char *argv[]) standardField = getStandardField(); standardPVField = getStandardPVField(); convert = getConvert(); + testAppendStructures(fd); testAppendSimple(fd); testAppendMore(fd); testAppends(fd);