added bitSetUtil
This commit is contained in:
@@ -102,6 +102,10 @@ LIBSRCS += pvDisplay.cpp
|
||||
LIBSRCS += pvEnumerated.cpp
|
||||
LIBSRCS += pvTimeStamp.cpp
|
||||
|
||||
SRC_DIRS += $(PVDATA)/pvMisc
|
||||
INC += bitSetUtil.h
|
||||
LIBSRCS += bitSetUtil.cpp
|
||||
|
||||
LIBRARY=pvData
|
||||
|
||||
pvData_LIBS += Com
|
||||
|
||||
77
pvDataApp/pvMisc/bitSetUtil.cpp
Normal file
77
pvDataApp/pvMisc/bitSetUtil.cpp
Normal file
@@ -0,0 +1,77 @@
|
||||
/*bitSetUtil.cpp*/
|
||||
/**
|
||||
* Copyright - See the COPYRIGHT that is included with this distribution.
|
||||
* EPICS pvDataCPP is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
*/
|
||||
#include "noDefaultMethods.h"
|
||||
#include "pvData.h"
|
||||
#include "bitSetUtil.h"
|
||||
|
||||
namespace epics { namespace pvData {
|
||||
|
||||
static bool checkBitSetPVField(
|
||||
PVField *pvField,BitSet *bitSet,int initialOffset)
|
||||
{
|
||||
bool atLeastOneBitSet = false;
|
||||
bool allBitsSet = true;
|
||||
int offset = initialOffset;
|
||||
int nbits = pvField->getNumberFields();
|
||||
if(nbits==1) return bitSet->get(offset);
|
||||
int nextSetBit = bitSet->nextSetBit(offset);
|
||||
if(nextSetBit>=(offset+nbits)) return false;
|
||||
if(bitSet->get(offset)) {
|
||||
if(nbits>1) {
|
||||
for(int i=offset+1; i<offset+nbits; i++) bitSet->clear(i);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
PVStructure *pvStructure = static_cast<PVStructure *>(pvField);
|
||||
while(offset<initialOffset + nbits) {
|
||||
PVField *pvSubField = pvStructure->getSubField(offset);
|
||||
int nbitsNow = pvSubField->getNumberFields();
|
||||
if(nbitsNow==1) {
|
||||
if(bitSet->get(offset)) {
|
||||
atLeastOneBitSet = true;
|
||||
} else {
|
||||
allBitsSet = false;
|
||||
}
|
||||
offset++;
|
||||
} else {
|
||||
offset++;
|
||||
PVStructure *pvSubStructure = static_cast<PVStructure*>(pvField);
|
||||
PVFieldPtrArray pvSubStructureFields =
|
||||
pvSubStructure->getPVFields();
|
||||
int num = pvSubStructure->getStructure()->getNumberFields();
|
||||
for(int i=0; i<num; i++) {
|
||||
PVField *pvSubSubField = pvSubStructureFields[i];
|
||||
bool result = checkBitSetPVField(pvSubSubField,bitSet,offset);
|
||||
if(result) {
|
||||
atLeastOneBitSet = true;
|
||||
if(!bitSet->get(offset)) {
|
||||
allBitsSet = false;
|
||||
}
|
||||
} else {
|
||||
allBitsSet = false;
|
||||
}
|
||||
offset += pvSubSubField->getNumberFields();
|
||||
}
|
||||
}
|
||||
}
|
||||
if(allBitsSet) {
|
||||
if(nbits>1) {
|
||||
for(int i=initialOffset+1; i<initialOffset+nbits; i++){
|
||||
bitSet->clear(i);
|
||||
}
|
||||
}
|
||||
bitSet->set(initialOffset);
|
||||
}
|
||||
return atLeastOneBitSet;
|
||||
}
|
||||
|
||||
bool BitSetUtil::compress(BitSet *bitSet,PVStructure *pvStructure)
|
||||
{
|
||||
return checkBitSetPVField(pvStructure,bitSet,0);
|
||||
}
|
||||
|
||||
}}
|
||||
20
pvDataApp/pvMisc/bitSetUtil.h
Normal file
20
pvDataApp/pvMisc/bitSetUtil.h
Normal file
@@ -0,0 +1,20 @@
|
||||
/*bitSetUtil.h*/
|
||||
/**
|
||||
* Copyright - See the COPYRIGHT that is included with this distribution.
|
||||
* EPICS pvDataCPP is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
*/
|
||||
#ifndef BITSETUTIL_H
|
||||
#define BITSETUTIL_H
|
||||
#include "noDefaultMethods.h"
|
||||
#include "pvData.h"
|
||||
|
||||
namespace epics { namespace pvData {
|
||||
|
||||
class BitSetUtil : private NoDefaultMethods {
|
||||
public:
|
||||
static bool compress(BitSet *bitSet,PVStructure *pvStructure);
|
||||
};
|
||||
|
||||
}}
|
||||
#endif /*BITSETUTIL_H */
|
||||
@@ -1,20 +1,20 @@
|
||||
|
||||
Time test
|
||||
diff 27.183001 milliSeconds
|
||||
time per iteration 27.183001 microseconds
|
||||
time per addTail/removeHead 0.013592 microseconds
|
||||
diff 26.576570 milliSeconds
|
||||
time per iteration 26.576570 microseconds
|
||||
time per addTail/removeHead 0.013288 microseconds
|
||||
|
||||
Time test locked
|
||||
diff 180.710025 milliSeconds
|
||||
time per iteration 180.710025 microseconds
|
||||
time per addTail/removeHead 0.090355 microseconds
|
||||
diff 176.520531 milliSeconds
|
||||
time per iteration 176.520531 microseconds
|
||||
time per addTail/removeHead 0.088260 microseconds
|
||||
|
||||
Time std::list test
|
||||
diff 653.096232 milliSeconds
|
||||
time per iteration 653.096232 microseconds
|
||||
time per addTail/removeHead 0.326548 microseconds
|
||||
diff 648.731941 milliSeconds
|
||||
time per iteration 648.731941 microseconds
|
||||
time per addTail/removeHead 0.324366 microseconds
|
||||
|
||||
Time std::list test locked
|
||||
diff 805.353607 milliSeconds
|
||||
time per iteration 805.353607 microseconds
|
||||
time per addTail/removeHead 0.402677 microseconds
|
||||
diff 800.533745 milliSeconds
|
||||
time per iteration 800.533745 microseconds
|
||||
time per addTail/removeHead 0.400267 microseconds
|
||||
|
||||
@@ -1 +1 @@
|
||||
time per call 46.344475 microseconds
|
||||
time per call 39.543418 microseconds
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
current 1291809855 958056849 milliSec 1291809855958
|
||||
2010.12.08 07:04:15 958056849 nanoSeconds isDst false
|
||||
current 1291810268 497980466 milliSec 1291810268497
|
||||
2010.12.08 07:11:08 497980466 nanoSeconds isDst false
|
||||
fromTime_t
|
||||
current 1291809855 0 milliSec 1291809855000
|
||||
2010.12.08 07:04:15 0 nanoSeconds isDst false
|
||||
current 1291810268 0 milliSec 1291810268000
|
||||
2010.12.08 07:11:08 0 nanoSeconds isDst false
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
one requested 0.400000 diff 0.400185 seconds
|
||||
two requested 0.200000 diff 0.200226 seconds
|
||||
one requested 0.200000 diff 0.200319 seconds
|
||||
two requested 0.400000 diff 0.400304 seconds
|
||||
one requested 0.000000 diff 0.000049 seconds
|
||||
two requested 0.000000 diff 0.000071 seconds
|
||||
one requested 0.400000 diff 0.400200 seconds
|
||||
two requested 0.200000 diff 0.200171 seconds
|
||||
one requested 0.200000 diff 0.200248 seconds
|
||||
two requested 0.400000 diff 0.400307 seconds
|
||||
one requested 0.000000 diff 0.000031 seconds
|
||||
two requested 0.000000 diff 0.000089 seconds
|
||||
|
||||
Reference in New Issue
Block a user