Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/ElmerGUI/netgen/libsrc/general/bitarray.hpp
3206 views
1
#ifndef FILE_BitArray
2
#define FILE_BitArray
3
4
/**************************************************************************/
5
/* File: bitarray.hpp */
6
/* Author: Joachim Schoeberl */
7
/* Date: 01. Jun. 95 */
8
/**************************************************************************/
9
10
#include <limits.h>
11
12
/**
13
data type BitArray
14
15
BitArray is a compressed array of Boolean information. By Set and Clear
16
the whole array or one bit can be set or reset, respectively.
17
Test returns the state of the accoring bit.
18
No range checking is done.
19
20
index ranges from 0 to size-1
21
*/
22
class BitArray
23
{
24
INDEX size;
25
unsigned char * data;
26
27
public:
28
BitArray ();
29
///
30
BitArray (INDEX asize);
31
///
32
~BitArray ();
33
34
///
35
void SetSize (INDEX asize);
36
///
37
INDEX Size () const
38
{
39
return size;
40
}
41
42
///
43
void Set ();
44
///
45
void Set (INDEX i)
46
{
47
data[Addr(i)] |= Mask(i);
48
}
49
50
void Clear ();
51
52
53
void Clear (INDEX i)
54
{
55
data[Addr(i)] &= ~Mask(i);
56
}
57
58
bool Test (INDEX i) const
59
{
60
return (data[i / CHAR_BIT] & (char(1) << (i % CHAR_BIT) ) ) ? true : false;
61
}
62
63
///
64
void Invert ();
65
///
66
void And (const BitArray & ba2);
67
///
68
void Or (const BitArray & ba2);
69
private:
70
///
71
inline unsigned char Mask (INDEX i) const
72
{
73
return char(1) << (i % CHAR_BIT);
74
}
75
///
76
inline INDEX Addr (INDEX i) const
77
{
78
return (i / CHAR_BIT);
79
}
80
81
///
82
BitArray & operator= (BitArray &);
83
///
84
BitArray (const BitArray &);
85
};
86
87
88
89
// print bitarray
90
inline ostream & operator<< (ostream & s, const BitArray & a)
91
{
92
for (int i = 1; i <= a.Size(); i++)
93
{
94
s << int (a.Test(i));
95
if (i % 40 == 0) s << "\n";
96
}
97
if (a.Size() % 40 != 0) s << "\n";
98
return s;
99
}
100
101
102
/*
103
inline
104
INDEX BitArray :: Size () const
105
{
106
return size;
107
}
108
109
inline
110
unsigned char BitArray :: Mask (INDEX i) const
111
{
112
return char(1) << (i % CHAR_BIT);
113
}
114
115
inline
116
INDEX BitArray :: Addr (INDEX i) const
117
{
118
return (i / CHAR_BIT);
119
}
120
inline
121
void BitArray :: Set (INDEX i)
122
{
123
data[Addr(i)] |= Mask(i);
124
}
125
126
inline
127
void BitArray :: Clear (INDEX i)
128
{
129
data[Addr(i)] &= ~Mask(i);
130
}
131
132
133
inline
134
int BitArray :: Test (INDEX i) const
135
{
136
return (data[i / CHAR_BIT] & (char(1) << (i % CHAR_BIT) ) ) ? 1 : 0;
137
}
138
139
*/
140
141
142
143
144
145
146
/**
147
data type BitArrayChar
148
149
BitArray is an array of Boolean information. By Set and Clear
150
the whole array or one bit can be set or reset, respectively.
151
Test returns the state of the accoring bit.
152
No range checking is done.
153
*/
154
template <int BASE = 1>
155
class BitArrayChar
156
{
157
///
158
ARRAY<char,BASE> data;
159
160
public:
161
///
162
BitArrayChar ()
163
{ ; }
164
///
165
BitArrayChar (int asize)
166
: data(asize)
167
{ ; }
168
///
169
~BitArrayChar ()
170
{ ; }
171
172
///
173
void SetSize (int asize)
174
{ data.SetSize(asize); }
175
176
///
177
inline int Size () const
178
{ return data.Size(); }
179
180
///
181
void Set ();
182
///
183
inline void Set (int i)
184
{ data[i] = 1; }
185
///
186
void Clear ();
187
///
188
inline void Clear (int i)
189
{ data[i] = 0; }
190
///
191
inline int Test (int i) const
192
{ return data[i]; }
193
///
194
void Invert ();
195
///
196
void And (const BitArrayChar & ba2);
197
///
198
void Or (const BitArrayChar & ba2);
199
private:
200
/// copy bitarray is not supported
201
BitArrayChar & operator= (BitArrayChar &) { return *this; }
202
/// copy bitarray is not supported
203
BitArrayChar (const BitArrayChar &) { ; }
204
};
205
206
207
208
209
template <int BASE>
210
inline ostream & operator<< (ostream & s, const BitArrayChar<BASE> & a)
211
{
212
for (int i = BASE; i < a.Size()+BASE; i++)
213
{
214
s << a.Test(i);
215
if ( (i-BASE) % 40 == 39) s << "\n";
216
}
217
if (a.Size() % 40 != 0) s << "\n";
218
return s;
219
}
220
221
222
#endif
223
224