added bitSetUtil

This commit is contained in:
Marty Kraimer
2010-12-08 07:48:40 -05:00
parent 3c060afedb
commit d0c4e78b4d
7 changed files with 124 additions and 23 deletions

View File

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

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

View 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 */

View File

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

View File

@@ -1 +1 @@
time per call 46.344475 microseconds
time per call 39.543418 microseconds

View File

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

View File

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