Mercurial > dedupe
changeset 49:f8d0ea827db3
Use BitArray.
| author | Tom Fredrik Blenning Klaussen <bfg@blenning.no> |
|---|---|
| date | Mon, 10 Sep 2012 23:59:46 +0200 |
| parents | ef429402e03b |
| children | f9fa7ea71d37 |
| files | BitDecoder.cpp BitDecoder.hpp FastBitDecoder.cpp FastBitDecoder.hpp HuffmanSet.cpp HuffmanSet.hpp |
| diffstat | 6 files changed, 59 insertions(+), 46 deletions(-) [+] |
line wrap: on
line diff
--- a/BitDecoder.cpp Mon Sep 10 23:59:25 2012 +0200 +++ b/BitDecoder.cpp Mon Sep 10 23:59:46 2012 +0200 @@ -41,37 +41,37 @@ } */ -QMap<QString, QBitArray> BitDecoder::createEncoder() const +QMap<QString, BitArray> BitDecoder::createEncoder() const { - QMap<QString, QBitArray> retVal; + QMap<QString, BitArray> retVal; if (!_data.isNull()) { - retVal.insert(_data, QBitArray()); + retVal.insert(_data, BitArray()); } if (low) { - QMap<QString, QBitArray> vals = low->createEncoder(); - for(QMap<QString, QBitArray>::const_iterator it = vals.begin(); + QMap<QString, BitArray> vals = low->createEncoder(); + for(QMap<QString, BitArray>::const_iterator it = vals.begin(); it != vals.end(); ++it) { - retVal.insert(it.key(), unite(QBitArray(1, false), it.value())); + retVal.insert(it.key(), unite(BitArray(1, false), it.value())); } } if (high) { - QMap<QString, QBitArray> vals = high->createEncoder(); - for(QMap<QString, QBitArray>::const_iterator it = vals.begin(); + QMap<QString, BitArray> vals = high->createEncoder(); + for(QMap<QString, BitArray>::const_iterator it = vals.begin(); it != vals.end(); ++it) { - retVal.insert(it.key(), unite(QBitArray(1, true), it.value())); + retVal.insert(it.key(), unite(BitArray(1, true), it.value())); } } return retVal; } -QBitArray BitDecoder::bitsFromString(const QString& str) +BitArray BitDecoder::bitsFromString(const QString& str) { - QBitArray bits(str.size()); + BitArray bits(str.size()); for (int i = 0; i < str.size(); ++i) { if (str[i] == '1') - bits[i] = true; + bits.setBit(i, true); else if (str[i] == '0') - bits[i] = false; + bits.setBit(i, false); else throw InvalidDataException(); }
--- a/BitDecoder.hpp Mon Sep 10 23:59:25 2012 +0200 +++ b/BitDecoder.hpp Mon Sep 10 23:59:46 2012 +0200 @@ -1,10 +1,12 @@ #ifndef BITDECODER_HPP #define BITDECODER_HPP -#include <QtCore/QBitArray> +//#include <QtCore/QBitArray> #include <QtCore/QMap> #include <QtCore/QString> +#include "BitArray.hpp" + class BitDecoder { BitDecoder* low; BitDecoder* high; @@ -13,7 +15,7 @@ private: BitDecoder(BitDecoder* low_in, BitDecoder* high_in); - uint decode(QString& resString, const QBitArray& bits, uint offset) const + uint decode(QString& resString, const BitArray& bits, uint offset) const { //Data is always stored in a leaf node. if (high) { @@ -30,7 +32,7 @@ ~BitDecoder(); const QString& data() const; - QString decode(const QBitArray& bits) const + QString decode(const BitArray& bits) const { QString combined; uint n = bits.size(); @@ -43,13 +45,13 @@ QString decode(const QString& bits) const; static BitDecoder* merge(BitDecoder* low, BitDecoder* high); - static QBitArray bitsFromString(const QString& str); + static BitArray bitsFromString(const QString& str); - static QBitArray unite(const QBitArray& first, const QBitArray& second) + static BitArray unite(const BitArray& first, const BitArray& second) { int n = first.size(); int n2 = second.size(); - QBitArray result(n + n2); + BitArray result(n + n2); for (int i = 0; i < n; ++i) { result.setBit(i, first.testBit(i)); } @@ -60,7 +62,7 @@ } - QMap<QString, QBitArray> createEncoder() const; + QMap<QString, BitArray> createEncoder() const; }; #endif //BITDECODER_HPP
--- a/FastBitDecoder.cpp Mon Sep 10 23:59:25 2012 +0200 +++ b/FastBitDecoder.cpp Mon Sep 10 23:59:46 2012 +0200 @@ -6,7 +6,7 @@ #include <cassert> -unsigned char FastBitDecoder::getPaddedChar(const QBitArray& bits, uint offset) +unsigned char FastBitDecoder::getPaddedChar(const BitArray& bits, uint offset) { unsigned char retVal = 0; size_t n = std::min(8u, bits.size() - offset); @@ -16,14 +16,14 @@ return retVal; } -QBitArray FastBitDecoder::removeFirst(const QBitArray& bits) +BitArray FastBitDecoder::removeFirst(const BitArray& bits) { size_t N = bits.size(); assert(N - 8 > 0); size_t n = N - 8; - QBitArray retVal(n); + BitArray retVal(n); for (size_t i = 0; i < n; ++i) { - retVal.setBit(i, bits.at(i + 8)); + retVal.setBit(i, bits.testBit(i + 8)); } return retVal; } @@ -58,10 +58,10 @@ } -FastBitDecoder::FastBitDecoder(const QMap<QString, QBitArray>& encoder) +FastBitDecoder::FastBitDecoder(const QMap<QString, BitArray>& encoder) { blank(); - for(QMap<QString, QBitArray>::const_iterator it = encoder.begin(); + for(QMap<QString, BitArray>::const_iterator it = encoder.begin(); it != encoder.end(); ++it) { insert(it.value(), it.key()); } @@ -69,7 +69,7 @@ } -void FastBitDecoder::insert(const QBitArray& key, const QString& value) +void FastBitDecoder::insert(const BitArray& key, const QString& value) { unsigned char l = getPaddedChar(key); if (key.size() <= 8) { @@ -85,7 +85,7 @@ } -uint FastBitDecoder::decode(QString& resString, const QBitArray& bits, uint offset) const +uint FastBitDecoder::decode(QString& resString, const BitArray& bits, uint offset) const { unsigned char l = getPaddedChar(bits, offset); if (data[l]) {
--- a/FastBitDecoder.hpp Mon Sep 10 23:59:25 2012 +0200 +++ b/FastBitDecoder.hpp Mon Sep 10 23:59:46 2012 +0200 @@ -1,9 +1,10 @@ #ifndef FASTBITDECODER_HPP #define FASTBITDECODER_HPP +#include "BitArray.hpp" + #include <QtCore/QString> #include <QtCore/QMap> -#include <QtCore/QBitArray> class FastBitDecoder { static const size_t N = 256; @@ -11,18 +12,18 @@ unsigned char numBits[N]; QString* data[N]; - static unsigned char getPaddedChar(const QBitArray& bitArray, uint offset = 0); - static QBitArray removeFirst(const QBitArray& bits); + static unsigned char getPaddedChar(const BitArray& bitArray, uint offset = 0); + static BitArray removeFirst(const BitArray& bits); void fill(); void blank(); FastBitDecoder(); - void insert(const QBitArray& key, const QString& value); - uint decode(QString& resString, const QBitArray& bits, uint offset) const; + void insert(const BitArray& key, const QString& value); + uint decode(QString& resString, const BitArray& bits, uint offset) const; public: - FastBitDecoder(const QMap<QString, QBitArray>& encoder); - QString decode(const QBitArray& bits) const + FastBitDecoder(const QMap<QString, BitArray>& encoder); + QString decode(const BitArray& bits) const { QString combined; uint n = bits.size();
--- a/HuffmanSet.cpp Mon Sep 10 23:59:25 2012 +0200 +++ b/HuffmanSet.cpp Mon Sep 10 23:59:46 2012 +0200 @@ -1,5 +1,8 @@ #include "HuffmanString.hpp" +#include "FastBitDecoder.hpp" +#include "BitDecoder.hpp" + #include "Exception/InvalidDataException.hpp" #include "Exception/NoSuchValueException.hpp" @@ -48,14 +51,14 @@ return retVal; } -QString HuffmanSet::decode(const QBitArray& bits) const +QString HuffmanSet::decode(const BitArray& bits) const { return lut->decode(bits); } -QBitArray HuffmanSet::encode(const QString& string, const QMap<QString, QBitArray>& encoder) +BitArray HuffmanSet::encode(const QString& string, const QMap<QString, BitArray>& encoder) { - QBitArray retVal; + BitArray retVal; QStringList c = chunks(string); foreach(const QString& fragment, c) { if (encoder.contains(fragment)) @@ -98,6 +101,10 @@ } numInserts = 0; delete lut; + /* + lut = new FastBitDecoder(encoder); + delete newLut; + */ lut = newLut; newStrings.clear(); } @@ -120,7 +127,7 @@ key_t key = hash(str); if (!contains(key)) { try { - QBitArray bits = encode(str, encoder); + BitArray bits = encode(str, encoder); map.insert(key, bits); } catch (InvalidDataException& e) {
--- a/HuffmanSet.hpp Mon Sep 10 23:59:25 2012 +0200 +++ b/HuffmanSet.hpp Mon Sep 10 23:59:46 2012 +0200 @@ -1,23 +1,26 @@ #ifndef HUFFMANSET_HPP #define HUFFMANSET_HPP -#include "BitDecoder.hpp" - -#include <QtCore/QBitArray> #include <QtCore/QMap> #include <QtCore/QString> #include <QtCore/QStringList> +#include "BitArray.hpp" + +class BitDecoder; +class FastBitDecoder; + class HuffmanSet { public: typedef uint key_t; private: QMap<key_t, QString> newStrings; - QMap<key_t, QBitArray> map; - QMap<QString, QBitArray> encoder; + QMap<key_t, BitArray> map; + QMap<QString, BitArray> encoder; uint cutoff; uint numInserts; + //FastBitDecoder* lut; BitDecoder* lut; @@ -26,8 +29,8 @@ void setCutoff(uint cutoff); static QStringList chunks(const QString& str); BitDecoder* createLut(const QMap<QString, uint>& freqTable); - QString decode(const QBitArray& bits) const; - static QBitArray encode(const QString& string, const QMap<QString, QBitArray>& encoder); + QString decode(const BitArray& bits) const; + static BitArray encode(const QString& string, const QMap<QString, BitArray>& encoder); void rebuild(); bool contains(key_t key) const; uint totalElements() const;
