From d0c4e78b4dc682c7cd3e3bafd485fd0f9b2e4812 Mon Sep 17 00:00:00 2001 From: Marty Kraimer Date: Wed, 8 Dec 2010 07:48:40 -0500 Subject: [PATCH] added bitSetUtil --- pvDataApp/Makefile | 4 ++ pvDataApp/pvMisc/bitSetUtil.cpp | 77 +++++++++++++++++++++++++++++++++ pvDataApp/pvMisc/bitSetUtil.h | 20 +++++++++ test/testLinkedListAux | 24 +++++----- test/testThreadAux | 2 +- test/testTimeStampAux | 8 ++-- test/testTimerAux | 12 ++--- 7 files changed, 124 insertions(+), 23 deletions(-) create mode 100644 pvDataApp/pvMisc/bitSetUtil.cpp create mode 100644 pvDataApp/pvMisc/bitSetUtil.h diff --git a/pvDataApp/Makefile b/pvDataApp/Makefile index 959677f..65794bd 100644 --- a/pvDataApp/Makefile +++ b/pvDataApp/Makefile @@ -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 diff --git a/pvDataApp/pvMisc/bitSetUtil.cpp b/pvDataApp/pvMisc/bitSetUtil.cpp new file mode 100644 index 0000000..e355e0e --- /dev/null +++ b/pvDataApp/pvMisc/bitSetUtil.cpp @@ -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; iclear(i); + } + return true; + } + PVStructure *pvStructure = static_cast(pvField); + while(offsetgetSubField(offset); + int nbitsNow = pvSubField->getNumberFields(); + if(nbitsNow==1) { + if(bitSet->get(offset)) { + atLeastOneBitSet = true; + } else { + allBitsSet = false; + } + offset++; + } else { + offset++; + PVStructure *pvSubStructure = static_cast(pvField); + PVFieldPtrArray pvSubStructureFields = + pvSubStructure->getPVFields(); + int num = pvSubStructure->getStructure()->getNumberFields(); + for(int i=0; iget(offset)) { + allBitsSet = false; + } + } else { + allBitsSet = false; + } + offset += pvSubSubField->getNumberFields(); + } + } + } + if(allBitsSet) { + if(nbits>1) { + for(int i=initialOffset+1; iclear(i); + } + } + bitSet->set(initialOffset); + } + return atLeastOneBitSet; +} + +bool BitSetUtil::compress(BitSet *bitSet,PVStructure *pvStructure) +{ + return checkBitSetPVField(pvStructure,bitSet,0); +} + +}} diff --git a/pvDataApp/pvMisc/bitSetUtil.h b/pvDataApp/pvMisc/bitSetUtil.h new file mode 100644 index 0000000..1c7c7f4 --- /dev/null +++ b/pvDataApp/pvMisc/bitSetUtil.h @@ -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 */ diff --git a/test/testLinkedListAux b/test/testLinkedListAux index b617fb5..8d0b691 100644 --- a/test/testLinkedListAux +++ b/test/testLinkedListAux @@ -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 diff --git a/test/testThreadAux b/test/testThreadAux index 007acf9..b156fe0 100644 --- a/test/testThreadAux +++ b/test/testThreadAux @@ -1 +1 @@ -time per call 46.344475 microseconds +time per call 39.543418 microseconds diff --git a/test/testTimeStampAux b/test/testTimeStampAux index 4aed38f..1b10845 100644 --- a/test/testTimeStampAux +++ b/test/testTimeStampAux @@ -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 diff --git a/test/testTimerAux b/test/testTimerAux index 9a5ed16..9ee1d80 100644 --- a/test/testTimerAux +++ b/test/testTimerAux @@ -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