changeset 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 f339499ecd79
children 76846cb92b5c
files HuffmanSet.cpp HuffmanSet.hpp
diffstat 2 files changed, 47 insertions(+), 11 deletions(-) [+]
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();
     }
   }
--- 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<key_t, QString> newStrings;
   QMap<key_t, BitArray> map;
   QMap<QString, BitArray> 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<QString, uint>& freqTable);
   QString decode(const BitArray& bits) const;
-  static BitArray encode(const QString& string, const QMap<QString, BitArray>& encoder);
+  static BitArray encode(const QString& string,
+			 const QMap<QString, BitArray>& encoder);
+  void generateFreqTable(QMap<QString, uint>& freqTable) const;
+  QMap<QString, uint> generateFreqTable() const;
   void rebuild();
   bool contains(key_t key) const;
   uint totalElements() const;