From ca3e22fd81dd3f840530d2a31b055507e1d7dd7a Mon Sep 17 00:00:00 2001 From: Marty Kraimer Date: Mon, 31 Jan 2011 09:38:12 -0500 Subject: [PATCH] add methods append and remove to PVStructureArray --- documentation/pvDataCpp.html | 10 +++++ pvDataApp/factory/BasePVStructureArray.h | 42 +++++++++++++++-- pvDataApp/pv/pvData.h | 2 + test/testPVStructureArray | 56 ----------------------- test/testPVStructureArrayDiff | 57 ++++++++++++++++++++++++ testApp/pv/testPVStructureArray.cpp | 28 ++---------- 6 files changed, 112 insertions(+), 83 deletions(-) diff --git a/documentation/pvDataCpp.html b/documentation/pvDataCpp.html index 06f8e72..48945d3 100644 --- a/documentation/pvDataCpp.html +++ b/documentation/pvDataCpp.html @@ -1691,6 +1691,8 @@ public: virtual ~PVStructureArray(); virtual StructureArrayConstPtr getStructureArray() = 0; virtual void setCapacity(int capacity) = 0; + virtual int append(int number) = 0; + virtual bool remove(int offset,int number) = 0; virtual int get(int offset, int length, StructureArrayData *data) = 0; virtual int put(int offset,int length, @@ -1712,6 +1714,14 @@ private:
getStructureArray
Get the introspection interface shared by each element.
+
append
+
Create new elements and append them to the end of the array. + It returns the index of the first new element.
+
remove
+
Remove the specfied set of elements. It returns (false,true) + if the elements (were not, were) removed. + It will not removed any elements unless all requested elements + exist or are null.

The other methods are similar to the methods for other array types.

diff --git a/pvDataApp/factory/BasePVStructureArray.h b/pvDataApp/factory/BasePVStructureArray.h index fd503b2..c487a8b 100644 --- a/pvDataApp/factory/BasePVStructureArray.h +++ b/pvDataApp/factory/BasePVStructureArray.h @@ -29,6 +29,8 @@ namespace epics { namespace pvData { StructureArrayConstPtr structureArray); virtual ~BasePVStructureArray(); virtual StructureArrayConstPtr getStructureArray(); + virtual int append(int number); + virtual bool remove(int offset,int number); virtual void setCapacity(int capacity); virtual int get(int offset, int length, StructureArrayData *data); @@ -62,8 +64,8 @@ namespace epics { namespace pvData { BasePVStructureArray::~BasePVStructureArray() { delete structureArrayData; - int length = getLength(); - for(int i=0; igetStructure(); + for(int i=currentLength; iincReferenceCount(); + value[i] = getPVDataCreate()->createPVStructure(0,structure); + } + return newLength; + } + + bool BasePVStructureArray::remove(int offset,int number) + { + int length = getCapacity(); + if(offset+number>length) return false; + for(int i=offset;i0) remove(length,numRemove); PVStructurePtrArray newValue = new PVStructurePtr[capacity]; int limit = length; if(length>capacity) limit = capacity; diff --git a/pvDataApp/pv/pvData.h b/pvDataApp/pv/pvData.h index ea61d25..acef197 100644 --- a/pvDataApp/pv/pvData.h +++ b/pvDataApp/pv/pvData.h @@ -162,6 +162,8 @@ class PVStructureArray : public PVArray { public: virtual ~PVStructureArray(); virtual StructureArrayConstPtr getStructureArray() = 0; + virtual int append(int number) = 0; + virtual bool remove(int offset,int number) = 0; virtual void setCapacity(int capacity) = 0; virtual int get(int offset, int length, StructureArrayData *data) = 0; diff --git a/test/testPVStructureArray b/test/testPVStructureArray index b84d060..9b3ed89 100644 --- a/test/testPVStructureArray +++ b/test/testPVStructureArray @@ -54,62 +54,6 @@ structure powerSupply timeStamp timeStamp long secondsPastEpoch 0 int nanoSeconds 0 - reference counts powerSupply referenceCount 1 - value referenceCount 1 - alarm referenceCount 14 - severity referenceCount 14 - message referenceCount 14 - timeStamp referenceCount 2 - secondsPastEpoch referenceCount 2 - nanoSeconds referenceCount 2 -before incReferenceCount reference counts powerSupply referenceCount 4 - voltage referenceCount 4 - value referenceCount 4 - alarm referenceCount 14 - severity referenceCount 14 - message referenceCount 14 - power referenceCount 4 - value referenceCount 4 - alarm referenceCount 14 - severity referenceCount 14 - message referenceCount 14 - current referenceCount 4 - value referenceCount 4 - alarm referenceCount 14 - severity referenceCount 14 - message referenceCount 14 -after incReferenceCount reference counts powerSupply referenceCount 5 - voltage referenceCount 5 - value referenceCount 5 - alarm referenceCount 17 - severity referenceCount 17 - message referenceCount 17 - power referenceCount 5 - value referenceCount 5 - alarm referenceCount 17 - severity referenceCount 17 - message referenceCount 17 - current referenceCount 5 - value referenceCount 5 - alarm referenceCount 17 - severity referenceCount 17 - message referenceCount 17 -after decReferenceCount reference counts powerSupply referenceCount 4 - voltage referenceCount 4 - value referenceCount 4 - alarm referenceCount 14 - severity referenceCount 14 - message referenceCount 14 - power referenceCount 4 - value referenceCount 4 - alarm referenceCount 14 - severity referenceCount 14 - message referenceCount 14 - current referenceCount 4 - value referenceCount 4 - alarm referenceCount 14 - severity referenceCount 14 - message referenceCount 14 field: totalConstruct 102 totalDestruct 102 pvField: totalConstruct 56 totalDestruct 56 linkedListNode: totalConstruct 5 totalDestruct 5 diff --git a/test/testPVStructureArrayDiff b/test/testPVStructureArrayDiff index e69de29..5557c62 100644 --- a/test/testPVStructureArrayDiff +++ b/test/testPVStructureArrayDiff @@ -0,0 +1,57 @@ +56a57,112 +> reference counts powerSupply referenceCount 1 +> value referenceCount 1 +> alarm referenceCount 14 +> severity referenceCount 14 +> message referenceCount 14 +> timeStamp referenceCount 2 +> secondsPastEpoch referenceCount 2 +> nanoSeconds referenceCount 2 +> before incReferenceCount reference counts powerSupply referenceCount 4 +> voltage referenceCount 4 +> value referenceCount 4 +> alarm referenceCount 14 +> severity referenceCount 14 +> message referenceCount 14 +> power referenceCount 4 +> value referenceCount 4 +> alarm referenceCount 14 +> severity referenceCount 14 +> message referenceCount 14 +> current referenceCount 4 +> value referenceCount 4 +> alarm referenceCount 14 +> severity referenceCount 14 +> message referenceCount 14 +> after incReferenceCount reference counts powerSupply referenceCount 5 +> voltage referenceCount 5 +> value referenceCount 5 +> alarm referenceCount 17 +> severity referenceCount 17 +> message referenceCount 17 +> power referenceCount 5 +> value referenceCount 5 +> alarm referenceCount 17 +> severity referenceCount 17 +> message referenceCount 17 +> current referenceCount 5 +> value referenceCount 5 +> alarm referenceCount 17 +> severity referenceCount 17 +> message referenceCount 17 +> after decReferenceCount reference counts powerSupply referenceCount 4 +> voltage referenceCount 4 +> value referenceCount 4 +> alarm referenceCount 14 +> severity referenceCount 14 +> message referenceCount 14 +> power referenceCount 4 +> value referenceCount 4 +> alarm referenceCount 14 +> severity referenceCount 14 +> message referenceCount 14 +> current referenceCount 4 +> value referenceCount 4 +> alarm referenceCount 14 +> severity referenceCount 14 +> message referenceCount 14 diff --git a/testApp/pv/testPVStructureArray.cpp b/testApp/pv/testPVStructureArray.cpp index 03049c4..bbd54b1 100644 --- a/testApp/pv/testPVStructureArray.cpp +++ b/testApp/pv/testPVStructureArray.cpp @@ -49,33 +49,13 @@ void testPowerSupplyArray(FILE * fd) { PVStructureArray * powerSupplyArray = powerSupplyArrayStruct->getStructureArrayField(String("value")); assert(powerSupplyArray!=0); - PVStructurePtrArray structureArray = new PVStructurePtr[3]; - StructureConstPtr structure = - powerSupplyArray->getStructureArray()->getStructure(); - structure->incReferenceCount(); - structureArray[0] = pvDataCreate->createPVStructure(0,structure); - structure->incReferenceCount(); - structureArray[1] = pvDataCreate->createPVStructure(0,structure); - structure->incReferenceCount(); - structureArray[2] = pvDataCreate->createPVStructure(0,structure); - powerSupplyArray->put(0,3,structureArray,0); + int offset = powerSupplyArray->append(3); + powerSupplyArray->setLength(offset); buffer.clear(); powerSupplyArrayStruct->toString(&buffer); fprintf(fd,"%s\n",buffer.c_str()); - buffer.clear(); - powerSupplyArrayStruct->getField()->dumpReferenceCount(&buffer,0); - fprintf(fd," reference counts %s\n",buffer.c_str()); - buffer.clear(); - structure->dumpReferenceCount(&buffer,0); - fprintf(fd,"before incReferenceCount reference counts %s\n",buffer.c_str()); - structure->incReferenceCount(); - buffer.clear(); - structure->dumpReferenceCount(&buffer,0); - fprintf(fd,"after incReferenceCount reference counts %s\n",buffer.c_str()); - structure->decReferenceCount(); - buffer.clear(); - structure->dumpReferenceCount(&buffer,0); - fprintf(fd,"after decReferenceCount reference counts %s\n",buffer.c_str()); + StructureConstPtr structure = + powerSupplyArray->getStructureArray()->getStructure(); delete powerSupplyArrayStruct; }