view BitDecoder.hpp @ 115:404795616b1e default tip

Added a lot of common files to ignore
author Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
date Sat, 25 Mar 2017 17:43:57 +0100
parents b9515dc35fe4
children
line wrap: on
line source

#ifndef BITDECODER_HPP
#define BITDECODER_HPP

//#include <QtCore/QBitArray>
#include <QtCore/QMap>
#include <QtCore/QString>

#include "BitArray.hpp"

class BitDecoder {
  BitDecoder* low;
  BitDecoder* high;
  QString _data;

private:
  BitDecoder(BitDecoder* low_in, BitDecoder* high_in);

  uint decode(QString& resString, const BitArray& bits, uint offset) const
  {
    //Data is always stored in a leaf node.
    if (high) {
      return (bits.testBit(offset) ? high : low)->
	decode(resString, bits, offset + 1) + 1;
    }
    else {
      resString.append(_data);
      return 1;
    }
  }

public:
  BitDecoder(const QString& d);
  ~BitDecoder();
  const QString& data() const;

  QString decode(const BitArray& bits) const
  {
    QString combined;
    uint n = bits.size();
    //Just a qualified overestimate guess on what we will need.
    combined.reserve(n/4);
    for (uint decodedBits = 0; decodedBits < n;
	 decodedBits += decode(combined, bits, decodedBits) - 1);
    combined.squeeze();
    return combined;
  }
  QString decode(const QString& bits) const;

  static BitDecoder* merge(BitDecoder* low, BitDecoder* high);
  static BitArray bitsFromString(const QString& str);

  static BitArray unite(const BitArray& first, const BitArray& second)
  {
    int n = first.size();
    int n2 = second.size();
    BitArray result(n + n2);
    for (int i = 0; i < n; ++i) {
      result.setBit(i, first.testBit(i));
    }
    for (int i = 0; i < n2; ++i) {
      result.setBit(n + i, second.testBit(i));
    }
    return result;
  }


  QMap<QString, BitArray> createEncoder() const;
};

#endif //BITDECODER_HPP