annotate BitArray.hpp @ 69:9161e9fd5b3f

Taking code out of class definition.
author Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
date Sat, 12 Jan 2013 11:50:42 +0100
parents f339499ecd79
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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