add methods append and remove to PVStructureArray
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user