add methods append and remove to PVStructureArray

This commit is contained in:
Marty Kraimer
2011-01-31 09:38:12 -05:00
parent ad9633c8f6
commit ca3e22fd81
6 changed files with 112 additions and 83 deletions

View File

@@ -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:
<dl>
<dt style="font-family: courier;">getStructureArray</dt>
<dd>Get the introspection interface shared by each element.</dd>
<dt style="font-family: courier;">append</dt>
<dd>Create new elements and append them to the end of the array.
It returns the index of the first new element.</dd>
<dt style="font-family: courier;">remove</dt>
<dd>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.</dd>
</dl>
<p>The other methods are similar to the methods for other array types.</p>

View File

@@ -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; i<length; i++) {
int number = getCapacity();
for(int i=0; i<number; i++) {
if(value[i]!=0) {
delete value[i];
}
@@ -71,6 +73,38 @@ namespace epics { namespace pvData {
delete[] value;
}
int BasePVStructureArray::append(int number)
{
int currentLength = getCapacity();
int newLength = currentLength + number;
setCapacity(newLength);
StructureConstPtr structure = structureArray->getStructure();
for(int i=currentLength; i<newLength; i++) {
structure->incReferenceCount();
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;i<offset+number;i++) {
if(value[i]!=0) {
delete value[i];
value[i] = 0;
}
}
// move any at end up
int nToMove = length - (offset+number);
for(int i=0; i<nToMove; i++) {
value[i+offset] = value[i+length];
value[i+length] = 0;
}
return true;
}
void BasePVStructureArray::setCapacity(int capacity) {
if(getCapacity()==capacity) return;
if(!isCapacityMutable()) {
@@ -78,7 +112,9 @@ namespace epics { namespace pvData {
PVField::message(message, errorMessage);
return;
}
int length = PVArray::getLength();
int length = getCapacity();
int numRemove = length - capacity;
if(numRemove>0) remove(length,numRemove);
PVStructurePtrArray newValue = new PVStructurePtr[capacity];
int limit = length;
if(length>capacity) limit = capacity;

View File

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

View File

@@ -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

View File

@@ -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

View File

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