Mercurial > dedupe
annotate BitDecoder.cpp @ 113:27e628852401
Add some error checking.
| author | Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no> |
|---|---|
| date | Tue, 03 May 2016 02:23:14 +0200 |
| parents | b9515dc35fe4 |
| children |
| rev | line source |
|---|---|
|
27
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
1 #include "BitDecoder.hpp" |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
2 |
|
45
41cc0d8ac77f
Decode directly from bitString.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
27
diff
changeset
|
3 #include "Exception/InvalidDataException.hpp" |
|
41cc0d8ac77f
Decode directly from bitString.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
27
diff
changeset
|
4 |
|
64
b9515dc35fe4
Make sure no file has greater linewidth than 80.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
49
diff
changeset
|
5 BitDecoder::BitDecoder(BitDecoder* low_in, BitDecoder* high_in) |
|
b9515dc35fe4
Make sure no file has greater linewidth than 80.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
49
diff
changeset
|
6 : low(low_in), high(high_in) |
|
27
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
7 { |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
8 } |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
9 |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
10 BitDecoder::BitDecoder(const QString& d) : low(0), high(0), _data(d) |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
11 { |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
12 } |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
13 |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
14 BitDecoder::~BitDecoder() |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
15 { |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
16 delete low; |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
17 delete high; |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
18 } |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
19 |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
20 const QString& BitDecoder::data() const |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
21 { |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
22 return _data; |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
23 } |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
24 |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
25 BitDecoder* BitDecoder::merge(BitDecoder* low, BitDecoder* high) |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
26 { |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
27 return new BitDecoder(low, high); |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
28 } |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
29 |
|
49
f8d0ea827db3
Use BitArray.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
45
diff
changeset
|
30 QMap<QString, BitArray> BitDecoder::createEncoder() const |
|
27
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
31 { |
|
49
f8d0ea827db3
Use BitArray.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
45
diff
changeset
|
32 QMap<QString, BitArray> retVal; |
|
27
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
33 if (!_data.isNull()) { |
|
49
f8d0ea827db3
Use BitArray.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
45
diff
changeset
|
34 retVal.insert(_data, BitArray()); |
|
27
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
35 } |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
36 if (low) { |
|
49
f8d0ea827db3
Use BitArray.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
45
diff
changeset
|
37 QMap<QString, BitArray> vals = low->createEncoder(); |
|
f8d0ea827db3
Use BitArray.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
45
diff
changeset
|
38 for(QMap<QString, BitArray>::const_iterator it = vals.begin(); |
|
27
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
39 it != vals.end(); ++it) { |
|
49
f8d0ea827db3
Use BitArray.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
45
diff
changeset
|
40 retVal.insert(it.key(), unite(BitArray(1, false), it.value())); |
|
27
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
41 } |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
42 } |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
43 if (high) { |
|
49
f8d0ea827db3
Use BitArray.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
45
diff
changeset
|
44 QMap<QString, BitArray> vals = high->createEncoder(); |
|
f8d0ea827db3
Use BitArray.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
45
diff
changeset
|
45 for(QMap<QString, BitArray>::const_iterator it = vals.begin(); |
|
27
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
46 it != vals.end(); ++it) { |
|
49
f8d0ea827db3
Use BitArray.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
45
diff
changeset
|
47 retVal.insert(it.key(), unite(BitArray(1, true), it.value())); |
|
27
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
48 } |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
49 } |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
50 return retVal; |
|
95a10553ff90
Optimize BitDecoder, and refactor functions that are not timecritical
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
51 } |
|
45
41cc0d8ac77f
Decode directly from bitString.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
27
diff
changeset
|
52 |
|
49
f8d0ea827db3
Use BitArray.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
45
diff
changeset
|
53 BitArray BitDecoder::bitsFromString(const QString& str) |
|
45
41cc0d8ac77f
Decode directly from bitString.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
27
diff
changeset
|
54 { |
|
49
f8d0ea827db3
Use BitArray.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
45
diff
changeset
|
55 BitArray bits(str.size()); |
|
45
41cc0d8ac77f
Decode directly from bitString.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
27
diff
changeset
|
56 for (int i = 0; i < str.size(); ++i) { |
|
41cc0d8ac77f
Decode directly from bitString.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
27
diff
changeset
|
57 if (str[i] == '1') |
|
49
f8d0ea827db3
Use BitArray.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
45
diff
changeset
|
58 bits.setBit(i, true); |
|
45
41cc0d8ac77f
Decode directly from bitString.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
27
diff
changeset
|
59 else if (str[i] == '0') |
|
49
f8d0ea827db3
Use BitArray.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
45
diff
changeset
|
60 bits.setBit(i, false); |
|
45
41cc0d8ac77f
Decode directly from bitString.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
27
diff
changeset
|
61 else |
|
41cc0d8ac77f
Decode directly from bitString.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
27
diff
changeset
|
62 throw InvalidDataException(); |
|
41cc0d8ac77f
Decode directly from bitString.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
27
diff
changeset
|
63 } |
|
41cc0d8ac77f
Decode directly from bitString.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
27
diff
changeset
|
64 return bits; |
|
41cc0d8ac77f
Decode directly from bitString.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
27
diff
changeset
|
65 } |
|
41cc0d8ac77f
Decode directly from bitString.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
27
diff
changeset
|
66 |
|
41cc0d8ac77f
Decode directly from bitString.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
27
diff
changeset
|
67 QString BitDecoder::decode(const QString& bits) const |
|
41cc0d8ac77f
Decode directly from bitString.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
27
diff
changeset
|
68 { |
|
41cc0d8ac77f
Decode directly from bitString.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
27
diff
changeset
|
69 return decode(bitsFromString(bits)); |
|
41cc0d8ac77f
Decode directly from bitString.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
27
diff
changeset
|
70 } |
