Mercurial > dedupe
changeset 52:725b0d776f3c
Fix a lot of problems with BitArray and reorganize which functions are
located in header and file.
| author | Tom Fredrik Blenning Klaussen <bfg@blenning.no> |
|---|---|
| date | Thu, 13 Sep 2012 23:23:14 +0200 |
| parents | 0bd3c1c46251 |
| children | bd7ca4ceefec |
| files | BitArray.cpp BitArray.hpp |
| diffstat | 2 files changed, 85 insertions(+), 22 deletions(-) [+] |
line wrap: on
line diff
--- a/BitArray.cpp Thu Sep 13 23:14:40 2012 +0200 +++ b/BitArray.cpp Thu Sep 13 23:23:14 2012 +0200 @@ -1,2 +1,43 @@ #include "BitArray.hpp" +#include <algorithm> + +BitArray::~BitArray() +{ + delete bits; +} + +BitArray::BitArray(const BitArray& other) : size_(other.size()), bits(new uchar[NUMCHARS(size_)]) +{ + memcpy(bits, other.bits, NUMCHARS(size_)); +} + +BitArray& BitArray::operator=(const BitArray& other) +{ + if (NUMCHARS(size_) != NUMCHARS(other.size_)) { + delete bits; + bits = new uchar[NUMCHARS(other.size_)]; + } + size_ = other.size_; + memcpy(bits, other.bits, NUMCHARS(size_)); + return *this; +} + +bool BitArray::operator==(const BitArray& rhs) const +{ + if (size() != rhs.size()) + return false; + for(size_t i = 0; i < size(); ++i) { + if (testBit(i) != rhs.testBit(i)) + return false; + } + return true; +} + +std::ostream& operator<<(std::ostream& out, const BitArray& rhs) +{ + for (size_t i = 0; i < rhs.size(); ++i) { + out << (rhs.testBit(i) ? "1" : "0"); + } + return out; +}
--- a/BitArray.hpp Thu Sep 13 23:14:40 2012 +0200 +++ b/BitArray.hpp Thu Sep 13 23:23:14 2012 +0200 @@ -6,10 +6,12 @@ #include <QtCore/QBitArray> typedef QBitArray BitArray; #else +#include <ostream> + #define HIGH(B) ((B) >> 3) #define LOW(B) ((B) & 0x07) -#define MASK(X) (0x1 << X) +#define MASK(X) (0x1 << (7 - X)) #define SELECTMASK(X) (uchar(MASK(X))) #define DESELECTMASK(X) (uchar(~MASK(X))) @@ -24,7 +26,28 @@ typedef unsigned int uint; uint size_; unsigned char* bits; + public: + BitArray(uint size, bool val) : size_(size), bits(new uchar[NUMCHARS(size)]) + { + uint n = NUMCHARS(size); + for (uint i = 0; i < n; ++i) { + bits[i] = (val) ? 0xff : 0; + } + } + + BitArray(uint size) : size_(size), bits(new uchar[NUMCHARS(size)]) + { + bits[NUMCHARS(size) - 1] = 0; + } + + BitArray() : size_(0), bits(0) + { + } + + BitArray(const BitArray& ); + + ~BitArray(); bool testBit(uint i) const { assert(i < size_); @@ -42,31 +65,30 @@ } } - BitArray(uint size) - { - size_ = size; - bits = new uchar[NUMCHARS(size)]; - } - - BitArray(uint size, bool val) : size_(size), bits(new uchar[NUMCHARS(size)]) - { - uint n = NUMCHARS(size); - for (uint i = 0; i < n; ++i) { - bits[i] = (val) ? 0xff : 0; - } - } - - BitArray() : size_(0), bits(0) - { - } - uint size() const { return size_; - } + } + + uchar getPaddedChar(size_t offset = 0) const + { + assert(size_ > 0); + assert(HIGH(offset) < NUMCHARS(size_)); + if (LOW(offset) == 0) + return bits[HIGH(offset)]; + + uchar next = ((HIGH(offset) + 1) < NUMCHARS(size_)) ? + bits[HIGH(offset) + 1] : 0; + return ((bits[HIGH(offset)] << 8) | next) >> (8 - LOW(offset)); + } + + + bool operator==(const BitArray& rhs) const; + BitArray& operator=(const BitArray& rhs); }; + +std::ostream& operator<<(std::ostream& out, const BitArray& rhs); + #endif #endif //BITARRAY_HPP - -
