diff --git a/documentation/RELEASE_NOTES.html b/documentation/RELEASE_NOTES.html index 1f0a423..d82aa6e 100644 --- a/documentation/RELEASE_NOTES.html +++ b/documentation/RELEASE_NOTES.html @@ -1,3 +1,30 @@ +

Release 5.0.4

+ +

The changes since release 5.0.3 are:

+ + + +

Fixed bitset serialization (issue #24)

+ +

C++ bitset serialization was not consistent with the C++ deserialization and +Java code in some instances (depending on the endianness of the serializer and deserializer) when the number of bits was 56-63 modulo 64. C++ serialization +has been fixed.

+ +

Fix exposed issue in deserialization on 32-bit platforms which +has also been corrected.

+ +

Fixed truncation in BitSet::or_and (issue #27)

+ +

If n, n1 and n2 words are used to store the values of the bitsets bitset, +bitset1 and bitset2 respectively then max(n, min(n1,n2)) words are needed +to store bitset.or_(bitset1, bitset2).

+ +

Previously min(n1,n2) words were used and the result would be truncated in +some instances. This has been fixed.

+

Release 5.0.3

The only change since release 5.0.2 is:

diff --git a/documentation/RELEASE_NOTES.md b/documentation/RELEASE_NOTES.md index 20abbb2..abbafc7 100644 --- a/documentation/RELEASE_NOTES.md +++ b/documentation/RELEASE_NOTES.md @@ -1,3 +1,33 @@ +Release 5.0.4 +============= + +The changes since release 5.0.3 are: + +* Fixed bitset serialization (issue #24) +* Fixed truncation in BitSet::or_and (issue #27) + +Fixed bitset serialization (issue #24) +-------------------------------------- + +C++ bitset serialization was not consistent with the C++ deserialization and +Java code in some instances (depending on the endianness of the serializer and +deserializer) when the number of bits was 56-63 modulo 64. C++ serialization +has been fixed. + +Fix exposed issue in deserialization on 32-bit platforms which +has also been corrected. + +Fixed truncation in BitSet::or_and (issue #27) +---------------------------------------------- + +If n, n1 and n2 words are used to store the values of the bitsets bitset, +bitset1 and bitset2 respectively then max(n, min(n1,n2)) words are needed +to store bitset.or_(bitset1, bitset2). + +Previously min(n1,n2) words were used and the result would be truncated in +some instances. This has been fixed. + + Release 5.0.3 ============= diff --git a/src/misc/bitSet.cpp b/src/misc/bitSet.cpp index 2da4fd8..de19ea9 100644 --- a/src/misc/bitSet.cpp +++ b/src/misc/bitSet.cpp @@ -279,7 +279,8 @@ namespace epics { namespace pvData { uint32 inUse = (set1.wordsInUse < set2.wordsInUse) ? set1.wordsInUse : set2.wordsInUse; ensureCapacity(inUse); - wordsInUse = inUse; + if(inUse>wordsInUse) + wordsInUse = inUse; // Perform logical AND on words in common for (uint32 i = 0; i < inUse; i++) @@ -322,12 +323,14 @@ namespace epics { namespace pvData { SerializeHelper::writeSize(len, buffer, flusher); flusher->ensureBuffer(len); - - for (uint32 i = 0; i < n - 1; i++) + + n = len / 8; + for (uint32 i = 0; i < n; i++) buffer->putLong(words[i]); - - for (uint64 x = words[n - 1]; x != 0; x >>= 8) - buffer->putByte((int8) (x & 0xff)); + + if (n < wordsInUse) + for (uint64 x = words[wordsInUse - 1]; x != 0; x >>= 8) + buffer->putByte((int8) (x & 0xff)); } void BitSet::deserialize(ByteBuffer* buffer, DeserializableControl* control) { @@ -356,7 +359,7 @@ namespace epics { namespace pvData { words[j] = 0; for (uint32 remaining = (bytes - longs * 8), j = 0; j < remaining; j++) - words[i] |= (buffer->getByte() & 0xffL) << (8 * j); + words[i] |= (buffer->getByte() & 0xffLL) << (8 * j); } diff --git a/testApp/misc/testBitSet.cpp b/testApp/misc/testBitSet.cpp index 36fc645..6cb2a3b 100644 --- a/testApp/misc/testBitSet.cpp +++ b/testApp/misc/testBitSet.cpp @@ -146,12 +146,19 @@ static void testOperators() b1.or_and(b2, b3); str = toString(b1); testOk1(str == "{2, 128}"); + + b1.clear(); b1.set(1); + b2.clear(); + b3.clear(); b3.set(1); + std::cout<<"# "<