Browse Source

Merge.

tempestpy_adaptions
dehnert 12 years ago
parent
commit
101c6c41ab
  1. 27
      src/storage/BitVector.h

27
src/storage/BitVector.h

@ -97,14 +97,13 @@ public:
* @param length The number of bits the bit vector should be able to hold.
* @param initTrue The initial value of the first |length| bits.
*/
BitVector(uint_fast64_t length, bool initTrue = false) : endIterator(*this, length, length, false) {
BitVector(uint_fast64_t length, bool initTrue = false) : bitCount(length), endIterator(*this, length, length, false), truncateMask((1ll << (bitCount & mod64mask)) - 1ll) {
// Check whether the given length is valid.
if (length == 0) {
LOG4CPLUS_ERROR(logger, "Trying to create bit vector of size 0.");
throw mrmc::exceptions::invalid_argument("Trying to create a bit vector of size 0.");
}
bitCount = length;
// Compute the correct number of buckets needed to store the given number of bits
bucketCount = length >> 6;
if ((length & mod64mask) != 0) {
@ -132,7 +131,7 @@ public:
* Copy Constructor. Performs a deep copy of the given bit vector.
* @param bv A reference to the bit vector to be copied.
*/
BitVector(const BitVector &bv) : bucketCount(bv.bucketCount), bitCount(bv.bitCount), endIterator(*this, bitCount, bitCount, false) {
BitVector(const BitVector &bv) : bucketCount(bv.bucketCount), bitCount(bv.bitCount), endIterator(*this, bitCount, bitCount, false), truncateMask((1ll << (bitCount & mod64mask)) - 1ll) {
LOG4CPLUS_WARN(logger, "Invoking copy constructor.");
bucketArray = new uint64_t[bucketCount];
std::copy(bv.bucketArray, bv.bucketArray + bucketCount, bucketArray);
@ -161,9 +160,9 @@ public:
}
bucketCount = bv.bucketCount;
bitCount = bv.bitCount;
this->bucketArray = new uint64_t[bucketCount];
std::copy(bv.bucketArray, bv.bucketArray + bucketCount, this->bucketArray);
updateEndIterator();
bucketArray = new uint64_t[bucketCount];
std::copy(bv.bucketArray, bv.bucketArray + bucketCount, bucketArray);
updateSizeChange();
return *this;
}
@ -190,7 +189,7 @@ public:
tempArray[i] = 0;
}
updateEndIterator();
updateSizeChange();
// Dispose of the old bit vector and set the new one.
delete[] this->bucketArray;
@ -244,7 +243,6 @@ public:
result.bucketArray[i] = this->bucketArray[i] & bv.bucketArray[i];
}
result.truncateLastBucket();
return result;
}
@ -263,7 +261,6 @@ public:
this->bucketArray[i] &= bv.bucketArray[i];
}
truncateLastBucket();
return *this;
}
@ -507,17 +504,17 @@ private:
*/
void truncateLastBucket() {
if ((bitCount & mod64mask) != 0) {
uint64_t mask = ((1ll << (bitCount & mod64mask)) - 1ll);
bucketArray[bucketCount - 1] = bucketArray[bucketCount - 1] & mask;
bucketArray[bucketCount - 1] = bucketArray[bucketCount - 1] & truncateMask;
}
}
/*!
* Updates the end iterator to the correct past-the-end position. Needs
* to be called whenever the size of the bit vector changed.
* Updates internal structures in case the size of the bit vector changed. Needs to be called
* after the size of the bit vector changed.
*/
void updateEndIterator() {
void updateSizeChange() {
endIterator.currentIndex = bitCount;
truncateMask = (1ll << (bitCount & mod64mask)) - 1ll;
}
/*! The number of 64-bit buckets we use as internal storage. */
@ -534,6 +531,8 @@ private:
/*! A bit mask that can be used to reduce a modulo operation to a logical "and". */
static const uint_fast64_t mod64mask = (1 << 6) - 1;
uint64_t truncateMask;
};
} // namespace storage

Loading…
Cancel
Save