# HG changeset patch # User Tom Fredrik Blenning Klaussen # Date 1347572849 -7200 # Node ID 19b2a2d98788ca3dfee8e41c2f0459c01a46660c # Parent f339499ecd79fe27bf1f9eab4eb36339b702d3db Use define to multiplex between different types of decoders. Expand the API. diff -r f339499ecd79 -r 19b2a2d98788 HuffmanSet.cpp --- 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 -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& freqTable) const { - QMap 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 HuffmanSet::generateFreqTable() const +{ + QMap freqTable; + generateFreqTable(freqTable); + return freqTable; +} + + +void HuffmanSet::rebuild() +{ + QMap 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(); } } diff -r f339499ecd79 -r 19b2a2d98788 HuffmanSet.hpp --- a/HuffmanSet.hpp Thu Sep 13 23:40:46 2012 +0200 +++ b/HuffmanSet.hpp Thu Sep 13 23:47:29 2012 +0200 @@ -10,27 +10,39 @@ class BitDecoder; class FastBitDecoder; +#define FASTENCODE 1 + class HuffmanSet { public: typedef uint key_t; private: + uint cutoff; + uint numInserts; + bool autoRebuild; + QMap newStrings; QMap map; QMap encoder; - uint cutoff; - uint numInserts; - //FastBitDecoder* lut; +#if FASTENCODE + FastBitDecoder* lut; +#else BitDecoder* lut; +#endif //FASTENCODE public: HuffmanSet(); + ~HuffmanSet(); void setCutoff(uint cutoff); + void setAutoRebuild(bool); static QStringList chunks(const QString& str); BitDecoder* createLut(const QMap& freqTable); QString decode(const BitArray& bits) const; - static BitArray encode(const QString& string, const QMap& encoder); + static BitArray encode(const QString& string, + const QMap& encoder); + void generateFreqTable(QMap& freqTable) const; + QMap generateFreqTable() const; void rebuild(); bool contains(key_t key) const; uint totalElements() const;