Elm  1.0
ELM is a library providing generic data structures, OS-independent interface, plugins and XML.
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
BitVector.h
1 /*
2  * $Id$
3  * deprecated support interface
4  *
5  * This file is part of OTAWA
6  * Copyright (c) 2005-08, IRIT UPS.
7  *
8  * OTAWA is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * OTAWA is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with OTAWA; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 #ifndef ELM_UTIL_BIT_VECTOR_H
23 #define ELM_UTIL_BIT_VECTOR_H
24 
25 #include <elm/assert.h>
26 #include <memory.h>
27 #include <elm/io.h>
28 #include <elm/PreIterator.h>
29 
30 namespace elm {
31 
32 // BitVector class
33 class BitVector {
34  typedef t::uint8 word_t;
35  static const int shift = 3;
36 public:
37  inline BitVector(void): bits(0), _size(0) { }
38  inline BitVector(int size, bool set = false);
39  inline BitVector(const BitVector& vec);
40  BitVector(const BitVector& vec, int new_size);
41  inline ~BitVector(void);
42 
43  inline int size(void) const;
44  inline bool bit(int index) const;
45  inline bool isEmpty(void) const;
46  inline bool includes(const BitVector& vec) const;
47  inline bool includesStrictly(const BitVector &vec) const;
48  inline bool equals(const BitVector& vec) const;
49  int countBits(void) const;
50  inline void resize(int new_size);
51 
52  inline void set(int index) const;
53  inline void set(int index, bool value) const;
54  inline void clear(int index) const;
55 
56  inline void copy(const BitVector& bits) const;
57  inline void clear(void);
58  inline void set(void) { memset(bits, 0xff, bytes()); mask(); }
59 
60  inline void applyNot(void);
61  inline void applyOr(const BitVector& vec);
62  inline void applyAnd(const BitVector& vec);
63  inline void applyReset(const BitVector& vec);
64 
65  inline BitVector makeNot(void) const;
66  inline BitVector makeOr(const BitVector& vec) const;
67  inline BitVector makeAnd(const BitVector& vec) const;
68  inline BitVector makeReset(const BitVector& vec) const;
69 
70  void print(io::Output& out) const;
71 
72  // useful operations
73  int countOnes(void) const;
74  inline int countZeroes(void) const { return countBits() - countOnes(); }
75 
76  // OneIterator iter
77  class OneIterator: public PreIterator<OneIterator, int> {
78  const BitVector& bvec;
79  int i;
80  public:
81  inline OneIterator(const BitVector& bit_vector): bvec(bit_vector), i(-1) { next(); }
82  inline int item(void) const { return i; }
83  inline bool ended(void) const { return i >= bvec.size(); }
84  inline void next(void) { do i++; while(i < bvec.size() && !bvec.bit(i)); }
85  };
86 
87  // ZeroIterator iter
88  class ZeroIterator: public PreIterator<ZeroIterator, int> {
89  const BitVector& bvec;
90  int i;
91  public:
92  inline ZeroIterator(const BitVector& bit_vector): bvec(bit_vector), i(-1) { next(); }
93  inline int item(void) const { return i; }
94  inline bool ended(void) const { return i >= bvec.size(); }
95  inline void next(void) { do i++; while(i < bvec.size() && bvec.bit(i)); }
96  };
97 
98  // Operators
99  inline operator bool(void) const;
100  inline bool operator[](int index) const;
101  inline BitVector operator~(void) const;
102  inline BitVector operator|(const BitVector& vec) const;
103  inline BitVector operator&(const BitVector& vec) const;
104  inline BitVector operator+(const BitVector& vec) const;
105  inline BitVector operator-(const BitVector& vec) const;
106  BitVector& operator=(const BitVector& vec);
107  inline BitVector& operator|=(const BitVector& vec);
108  inline BitVector& operator&=(const BitVector& vec);
109  inline BitVector& operator+=(const BitVector& vec);
110  inline BitVector& operator-=(const BitVector& vec);
111  inline bool operator==(const BitVector& vec) const;
112  inline bool operator!=(const BitVector& vec) const;
113  inline bool operator<(const BitVector& vec) const;
114  inline bool operator<=(const BitVector& vec) const;
115  inline bool operator>(const BitVector& vec) const;
116  inline bool operator>=(const BitVector& vec) const;
117 
118  inline t::size __size(void) const { return sizeof(*this) + bytes(); }
119 
120 private:
121  word_t *bits;
122  int _size;
123  inline void mask(void) const;
124  inline int bytes(void) const;
125  inline int byte_index(int index) const;
126  inline int bit_index(int index) const;
127 };
128 
129 
130 // IO functions
131 inline io::Output& operator<<(io::Output& out, const BitVector& bvec) {
132  bvec.print(out);
133  return out;
134 }
135 
136 // Inlines
137 inline int BitVector::bytes(void) const {
138  return (_size + 7) / 8;
139 }
140 
141 inline void BitVector::mask(void) const {
142  unsigned char mask = 0xff >> (8 - (_size % 8));
143  if(mask)
144  bits[bytes() - 1] &= mask;
145 }
146 
147 inline int BitVector::byte_index(int index) const {
148  return index / 8;
149 }
150 inline int BitVector::bit_index(int index) const {
151  return index % 8;
152 }
153 
154 inline BitVector::BitVector(int size, bool set): _size(size) {
155  ASSERTP(size > 0, "size must be positive");
156  bits = new unsigned char[bytes()];
157  ASSERT(bits);
158  memset(bits, set ? 0xff : 0, bytes());
159 }
160 
161 inline BitVector::BitVector(const BitVector& vec): _size(vec.size()) {
162  bits = new unsigned char[bytes()];
163  ASSERT(bits);
164  memcpy(bits, vec.bits, bytes());
165 }
166 
167 inline BitVector::~BitVector(void) {
168  if(bits)
169  delete [] bits;
170 }
171 
172 inline int BitVector::size(void) const {
173  return _size;
174 }
175 
176 inline bool BitVector::bit(int index) const {
177  ASSERTP(index < _size, "index out of bounds");
178  return (bits[byte_index(index)] & (1 << bit_index(index))) != 0;
179 }
180 
181 inline bool BitVector::isEmpty(void) const {
182  mask();
183  for(int i = 0; i < bytes(); i++)
184  if(bits[i])
185  return false;
186  return true;
187 }
188 
189 inline bool BitVector::includes(const BitVector& vec) const {
190  ASSERTP(_size == vec._size, "bit vector must have the same size");
191  mask();
192  for(int i = 0; i < bytes(); i++)
193  if(~bits[i] & vec.bits[i])
194  return false;
195  return true;
196 }
197 
198 inline bool BitVector::includesStrictly(const BitVector &vec) const {
199  ASSERTP(_size == vec._size, "bit vector must have the same size");
200  mask();
201  bool equal = true;
202  for(int i = 0; i < bytes(); i++) {
203  if(~bits[i] & vec.bits[i])
204  return false;
205  if(bits[i] != vec.bits[i])
206  equal = false;
207  }
208  return !equal;
209 }
210 
211 inline bool BitVector::equals(const BitVector& vec) const {
212  ASSERTP(_size == vec._size, "bit vector must have the same size");
213  mask();
214  for(int i = 0; i < bytes(); i++)
215  if(bits[i] != vec.bits[i])
216  return false;
217  return true;
218 }
219 
220 inline void BitVector::set(int index) const {
221  ASSERTP(index < _size, "index out of bounds");
222  bits[byte_index(index)] |= 1 << bit_index(index);
223 }
224 
225 inline void BitVector::set(int index, bool value) const {
226  ASSERTP(index < _size, "index out of bounds");
227  if(value)
228  set(index);
229  else
230  clear(index);
231 }
232 
233 inline void BitVector::clear(int index) const {
234  ASSERTP(index < _size, "index out of bounds");
235  bits[byte_index(index)] &= ~(1 << bit_index(index));
236 }
237 
238 inline void BitVector::copy(const BitVector& vec) const {
239  ASSERTP(_size == vec._size, "bit vectors must have the same size");
240  memcpy(bits, vec.bits, bytes());
241 }
242 
243 inline void BitVector::clear(void) {
244  memset(bits, 0, bytes());
245 }
246 
247 inline void BitVector::applyNot(void) {
248  for(int i = 0; i < bytes(); i++)
249  bits[i] = ~bits[i];
250 }
251 
252 inline void BitVector::applyOr(const BitVector& vec) {
253  ASSERTP(_size == vec._size, "bit vectors must have the same size");
254  for(int i = 0; i < bytes(); i++)
255  bits[i] |= vec.bits[i];
256 }
257 
258 inline void BitVector::applyAnd(const BitVector& vec) {
259  ASSERTP(_size == vec._size, "bit vectors must have the same size");
260  for(int i = 0; i < bytes(); i++)
261  bits[i] &= vec.bits[i];
262 }
263 
264 inline void BitVector::applyReset(const BitVector& vec) {
265  ASSERTP(_size == vec._size, "bit vectors must have the same size");
266  for(int i = 0; i < bytes(); i++)
267  bits[i] &= ~vec.bits[i];
268  mask();
269 }
270 
271 inline BitVector BitVector::makeNot(void) const {
272  BitVector vec(_size);
273  for(int i = 0; i < bytes(); i++)
274  vec.bits[i] = ~ bits[i];
275  return vec;
276 }
277 
278 inline BitVector BitVector::makeOr(const BitVector& vec) const {
279  ASSERTP(_size == vec._size, "bit vectors must have the same size");
280  BitVector res(_size);
281  for(int i = 0; i < bytes(); i++)
282  res.bits[i] = bits[i] | vec.bits[i];
283  return res;
284 }
285 
286 inline BitVector BitVector::makeAnd(const BitVector& vec) const {
287  ASSERTP(_size == vec._size, "bit vectors must have the same size");
288  BitVector res(_size);
289  for(int i = 0; i < bytes(); i++)
290  res.bits[i] = bits[i] & vec.bits[i];
291  return res;
292 }
293 
294 inline BitVector BitVector::makeReset(const BitVector& vec) const {
295  ASSERTP(_size == vec._size, "bit vectors must have the same size");
296  BitVector res(_size);
297  for(int i = 0; i < bytes(); i++)
298  res.bits[i] = bits[i] & ~vec.bits[i];
299  return res;
300 }
301 
302 inline BitVector::operator bool(void) const {
303  return !isEmpty();
304 }
305 
306 inline bool BitVector::operator[](int index) const {
307  return bit(index);
308 }
309 
310 inline BitVector BitVector::operator~(void) const {
311  return makeNot();
312 }
313 
314 inline BitVector BitVector::operator|(const BitVector& vec) const {
315  return makeOr(vec);
316 }
317 
318 inline BitVector BitVector::operator&(const BitVector& vec) const {
319  return makeAnd(vec);
320 }
321 
322 inline BitVector BitVector::operator+(const BitVector& vec) const {
323  return makeOr(vec);
324 }
325 
326 inline BitVector BitVector::operator-(const BitVector& vec) const {
327  return makeReset(vec);
328 }
329 
331  applyOr(vec);
332  return *this;
333 }
334 
336  applyAnd(vec);
337  return *this;
338 }
339 
341  applyOr(vec);
342  return *this;
343 }
344 
346  applyReset(vec);
347  return *this;
348 }
349 
350 inline bool BitVector::operator==(const BitVector& vec) const {
351  return equals(vec);
352 }
353 
354 inline bool BitVector::operator!=(const BitVector& vec) const {
355  return !equals(vec);
356 }
357 
358 inline bool BitVector::operator<(const BitVector& vec) const {
359  return vec.includesStrictly(*this);
360 }
361 
362 inline bool BitVector::operator<=(const BitVector& vec) const {
363  return vec.includes(*this);
364 }
365 
366 inline bool BitVector::operator>(const BitVector& vec) const {
367  return includesStrictly(vec);
368 }
369 
370 inline bool BitVector::operator>=(const BitVector& vec) const {
371  return includes(vec);
372 }
373 
374 inline void BitVector::resize(int new_size) {
375  int new_bytes = (new_size + 7) >> 3;
376  if(bytes() != new_bytes) {
377  if(bits)
378  delete [] bits;
379  bits = new unsigned char[new_bytes];
380  }
381  _size = new_size;
382 }
383 
384 } // elm
385 
386 #endif // ELM_UTIL_BIT_VECTOR_H
BitVector operator~(void) const
Definition: BitVector.h:310
bool includes(const BitVector &vec) const
Definition: BitVector.h:189
void set(T *target, int size, const T &v)
Definition: array.h:63
BitVector makeOr(const BitVector &vec) const
Definition: BitVector.h:278
Definition: PreIterator.h:29
BitVector(void)
Definition: BitVector.h:37
BitVector makeReset(const BitVector &vec) const
Definition: BitVector.h:294
bool equals(const BitVector &vec) const
Definition: BitVector.h:211
bool operator<(const BitVector &vec) const
Definition: BitVector.h:358
Definition: Output.h:161
t::size __size(void) const
Definition: BitVector.h:118
BitVector makeAnd(const BitVector &vec) const
Definition: BitVector.h:286
bool ended(void) const
Definition: BitVector.h:94
int item(void) const
Definition: BitVector.h:93
WAHVector::word_t word_t
Definition: util_WAHVector.cpp:29
BitVector makeNot(void) const
Definition: BitVector.h:271
void clear(void)
Definition: BitVector.h:243
Definition: BitVector.h:77
bool includesStrictly(const BitVector &vec) const
Definition: BitVector.h:198
int countBits(void) const
Definition: util_BitVector.cpp:372
BitVector operator+(const BitVector &vec) const
Definition: BitVector.h:322
bool bit(int index) const
Definition: BitVector.h:176
uint32 size
Definition: int.h:41
~BitVector(void)
Definition: BitVector.h:167
bool operator<=(const BitVector &vec) const
Definition: BitVector.h:362
void next(void)
Definition: BitVector.h:84
Definition: BitVector.h:33
value_t value(CString name, int value)
Definition: rtti.h:40
bool operator>=(const BitVector &vec) const
Definition: BitVector.h:370
void resize(int new_size)
Definition: BitVector.h:374
int item(void) const
Definition: BitVector.h:82
OneIterator(const BitVector &bit_vector)
Definition: BitVector.h:81
bool operator==(const BitVector &vec) const
Definition: BitVector.h:350
BitVector operator-(const BitVector &vec) const
Definition: BitVector.h:326
int countOnes(void) const
Definition: util_BitVector.cpp:401
BitVector operator|(const BitVector &vec) const
Definition: BitVector.h:314
BitVector & operator+=(const BitVector &vec)
Definition: BitVector.h:340
BitVector operator&(const BitVector &vec) const
Definition: BitVector.h:318
uint8_t uint8
Definition: int.h:31
ZeroIterator(const BitVector &bit_vector)
Definition: BitVector.h:92
sys::SystemOutStream & out
Definition: system_SystemIO.cpp:101
bool isEmpty(void) const
Definition: BitVector.h:181
bool ended(void) const
Definition: BitVector.h:83
int size(void) const
Definition: BitVector.h:172
void set(void)
Definition: BitVector.h:58
BitVector & operator=(const BitVector &vec)
Definition: util_BitVector.cpp:93
AutoString & operator<<(CString str, const T &value)
Definition: AutoString.h:90
int countZeroes(void) const
Definition: BitVector.h:74
bool operator[](int index) const
Definition: BitVector.h:306
void applyReset(const BitVector &vec)
Definition: BitVector.h:264
BitVector & operator-=(const BitVector &vec)
Definition: BitVector.h:345
BitVector & operator|=(const BitVector &vec)
Definition: BitVector.h:330
void applyNot(void)
Definition: BitVector.h:247
void applyOr(const BitVector &vec)
Definition: BitVector.h:252
void applyAnd(const BitVector &vec)
Definition: BitVector.h:258
void print(io::Output &out) const
Definition: util_BitVector.cpp:363
Definition: BitVector.h:88
void copy(const BitVector &bits) const
Definition: BitVector.h:238
BitVector & operator&=(const BitVector &vec)
Definition: BitVector.h:335
bool operator>(const BitVector &vec) const
Definition: BitVector.h:366
bool operator!=(const BitVector &vec) const
Definition: BitVector.h:354
void next(void)
Definition: BitVector.h:95