Mercurial > dedupe
view BitDecoder.hpp @ 64:b9515dc35fe4
Make sure no file has greater linewidth than 80.
| author | Tom Fredrik Blenning Klaussen <bfg@blenning.no> |
|---|---|
| date | Fri, 14 Sep 2012 22:50:45 +0200 |
| parents | f8d0ea827db3 |
| 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
