Mercurial > dedupe
diff HuffmanSet.cpp @ 55:19b2a2d98788
Use define to multiplex between different types of decoders.
Expand the API.
| author | Tom Fredrik Blenning Klaussen <bfg@blenning.no> |
|---|---|
| date | Thu, 13 Sep 2012 23:47:29 +0200 |
| parents | f8d0ea827db3 |
| children | e5fa379d4030 |
line wrap: on
line diff
--- a/HuffmanSet.cpp Thu Sep 13 23:40:46 2012 +0200 +++ b/HuffmanSet.cpp Thu Sep 13 23:47:29 2012 +0200 @@ -8,15 +8,25 @@ #include <QtCore/QHash> -HuffmanSet::HuffmanSet() : cutoff(256), numInserts(0), lut(0) +HuffmanSet::HuffmanSet() : cutoff(1024), numInserts(0), lut(0) { } +HuffmanSet::~HuffmanSet() +{ + delete lut; +} + void HuffmanSet::setCutoff(uint cutoff) { this->cutoff = cutoff; } +void HuffmanSet::setAutoRebuild(bool autoRebuild) +{ + this->autoRebuild = autoRebuild; +} + QStringList HuffmanSet::chunks(const QString& str) { return str.split("", QString::SkipEmptyParts); @@ -74,10 +84,8 @@ return newStrings.size() + map.size(); } -void HuffmanSet::rebuild() +void HuffmanSet::generateFreqTable(QMap<QString, uint>& freqTable) const { - QMap<QString, uint> freqTable; - foreach(key_t key, map.keys()) { foreach(const QString& chunk, chunks(decode(map.value(key)))) { ++freqTable[chunk]; @@ -88,6 +96,21 @@ ++freqTable[chunk]; } } +} + +QMap<QString, uint> HuffmanSet::generateFreqTable() const +{ + QMap<QString, uint> freqTable; + generateFreqTable(freqTable); + return freqTable; +} + + +void HuffmanSet::rebuild() +{ + QMap<QString, uint> freqTable; + + generateFreqTable(freqTable); BitDecoder* newLut = createLut(freqTable); @@ -101,11 +124,12 @@ } numInserts = 0; delete lut; - /* +#if FASTENCODE lut = new FastBitDecoder(encoder); delete newLut; - */ +#else lut = newLut; +#endif //FASTENCODE newStrings.clear(); } @@ -133,7 +157,7 @@ catch (InvalidDataException& e) { newStrings.insert(key, str); } - if (++numInserts >= cutoff) { + if ((++numInserts >= cutoff) && autoRebuild) { rebuild(); } }
