Mercurial > dedupe
annotate BitArray.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 | 9161e9fd5b3f |
| children |
| rev | line source |
|---|---|
|
47
b23f04d4a276
Test a custom BitArray.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
1 #ifndef BITARRAY_HPP |
|
b23f04d4a276
Test a custom BitArray.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
2 #define BITARRAY_HPP |
|
b23f04d4a276
Test a custom BitArray.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
3 |
|
52
725b0d776f3c
Fix a lot of problems with BitArray and reorganize which functions are
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
47
diff
changeset
|
4 #include <ostream> |
|
725b0d776f3c
Fix a lot of problems with BitArray and reorganize which functions are
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
47
diff
changeset
|
5 |
|
69
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
6 #include <cassert> |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
7 |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
8 typedef unsigned char uchar; |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
9 typedef unsigned int uint; |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
10 |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
11 class BitArray |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
12 { |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
13 uint size_; |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
14 unsigned char* bits; |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
15 |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
16 public: |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
17 BitArray(uint size, bool val); |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
18 |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
19 BitArray(uint size); |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
20 BitArray(); |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
21 BitArray(const BitArray& ); |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
22 |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
23 ~BitArray(); |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
24 bool testBit(uint i) const; |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
25 void setBit(uint i, bool val); |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
26 uint size() const; |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
27 uchar getPaddedChar(size_t offset = 0) const; |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
28 |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
29 bool operator==(const BitArray& rhs) const; |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
30 BitArray& operator=(const BitArray& rhs); |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
31 }; |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
32 |
|
54
f339499ecd79
Remove multiplexing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
52
diff
changeset
|
33 //We should remove these defines from the header, but we keep them for |
|
f339499ecd79
Remove multiplexing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
52
diff
changeset
|
34 //now until we have stabilized the API and removed any bugs. |
|
47
b23f04d4a276
Test a custom BitArray.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
35 #define HIGH(B) ((B) >> 3) |
|
b23f04d4a276
Test a custom BitArray.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
36 #define LOW(B) ((B) & 0x07) |
|
52
725b0d776f3c
Fix a lot of problems with BitArray and reorganize which functions are
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
47
diff
changeset
|
37 #define MASK(X) (0x1 << (7 - X)) |
|
47
b23f04d4a276
Test a custom BitArray.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
38 #define SELECTMASK(X) (uchar(MASK(X))) |
|
b23f04d4a276
Test a custom BitArray.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
39 #define DESELECTMASK(X) (uchar(~MASK(X))) |
|
b23f04d4a276
Test a custom BitArray.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
40 #define NUMCHARS(X) HIGH(X + 7) |
|
b23f04d4a276
Test a custom BitArray.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
41 |
|
52
725b0d776f3c
Fix a lot of problems with BitArray and reorganize which functions are
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
47
diff
changeset
|
42 |
|
725b0d776f3c
Fix a lot of problems with BitArray and reorganize which functions are
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
47
diff
changeset
|
43 |
|
69
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
44 inline BitArray::BitArray(uint size, bool val) : size_(size), bits(new uchar[NUMCHARS(size)]) |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
45 { |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
46 uint n = NUMCHARS(size); |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
47 for (uint i = 0; i < n; ++i) { |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
48 bits[i] = (val) ? 0xff : 0; |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
49 } |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
50 } |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
51 |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
52 inline BitArray::BitArray(uint size) : size_(size), bits(new uchar[NUMCHARS(size)]) |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
53 { |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
54 //We need to initialize the bits beyond size, since they are |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
55 //implicitly used in certain functions. |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
56 bits[NUMCHARS(size) - 1] = 0; |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
57 } |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
58 |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
59 inline BitArray::BitArray() : size_(0), bits(0) |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
60 { |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
61 } |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
62 |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
63 inline bool BitArray::testBit(uint i) const |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
64 { |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
65 assert(i < size_); |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
66 return bits[HIGH(i)] & MASK(LOW(i)); |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
67 } |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
68 |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
69 inline void BitArray::setBit(uint i, bool val) |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
70 { |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
71 assert(i < size_); |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
72 if (val) { |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
73 bits[HIGH(i)] |= SELECTMASK(LOW(i)); |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
74 } |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
75 else { |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
76 bits[HIGH(i)] &= DESELECTMASK(LOW(i)); |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
77 } |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
78 } |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
79 |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
80 inline uint BitArray::size() const |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
81 { |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
82 return size_; |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
83 } |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
84 |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
85 inline uchar BitArray::getPaddedChar(size_t offset) const |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
86 { |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
87 assert(size_ > 0); |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
88 assert(HIGH(offset) < NUMCHARS(size_)); |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
89 if (LOW(offset) == 0) |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
90 return bits[HIGH(offset)]; |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
91 |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
92 uchar next = ((HIGH(offset) + 1) < NUMCHARS(size_)) ? |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
93 bits[HIGH(offset) + 1] : 0; |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
94 return ((bits[HIGH(offset)] << 8) | next) >> (8 - LOW(offset)); |
|
9161e9fd5b3f
Taking code out of class definition.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents:
54
diff
changeset
|
95 } |
|
52
725b0d776f3c
Fix a lot of problems with BitArray and reorganize which functions are
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
47
diff
changeset
|
96 |
|
725b0d776f3c
Fix a lot of problems with BitArray and reorganize which functions are
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
47
diff
changeset
|
97 std::ostream& operator<<(std::ostream& out, const BitArray& rhs); |
|
725b0d776f3c
Fix a lot of problems with BitArray and reorganize which functions are
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
47
diff
changeset
|
98 |
|
47
b23f04d4a276
Test a custom BitArray.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff
changeset
|
99 #endif //BITARRAY_HPP |
