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;
}