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();
     }
   }