00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _BITSET_H_
00012 #define _BITSET_H_
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "CH_assert.H"
00025 #include <iostream>
00026 #include "CH_Timer.H"
00027 #include "BaseNamespaceHeader.H"
00028
00029 #define BITSETWORD unsigned int
00030 const int BITSETWORDSIZE = 8*sizeof(unsigned int);
00031
00032
00033 using std::ostream;
00034
00035 class BitSetIterator;
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064 class BitSet
00065 {
00066 public:
00067
00068 BitSet();
00069
00070
00071 BitSet(int bits, bool init);
00072
00073
00074 void define(int bits, bool init);
00075
00076
00077 BitSet(const BitSet& rhs);
00078
00079
00080 BitSet& operator=(const BitSet& rhs);
00081
00082
00083
00084
00085
00086
00087
00088 bool operator<(const BitSet& rhs) const;
00089
00090
00091 ~BitSet();
00092
00093
00094
00095 bool operator[](int i) const;
00096
00097
00098
00099
00100
00101
00102 void setTrue(int i);
00103
00104
00105 void setFalse(int i);
00106
00107
00108 void setAllTrue();
00109
00110
00111 void setAllFalse();
00112
00113
00114
00115
00116
00117 bool isEmpty() const;
00118
00119
00120
00121
00122
00123 bool isFull() const;
00124
00125
00126 int size() const;
00127 static int initialize();
00128
00129 int linearSize() const;
00130
00131 void linearIn(const void* const inBuf);
00132
00133 void linearOut(void* const a_outBuf) const;
00134
00135
00136 static long int bytes;
00137 static long int peak;
00138
00139 private:
00140 friend class BitSetIterator;
00141 friend class BitSetTrueIterator;
00142
00143 BITSETWORD* m_bits;
00144 int m_size;
00145 int m_length;
00146
00147 static BITSETWORD trueMasks[BITSETWORDSIZE];
00148 };
00149
00150
00151
00152 inline bool BitSet::operator[](int i) const
00153 {
00154 CH_assert(i>=0);
00155 CH_assert(i<m_size);
00156 int index = i/BITSETWORDSIZE;
00157 CH_assert(index < m_length);
00158 int remainder = i-BITSETWORDSIZE*index;
00159 BITSETWORD tmp = m_bits[index] & trueMasks[remainder];
00160 return tmp > 0;
00161 }
00162
00163 inline int BitSet::size() const
00164 {
00165 return m_size;
00166 }
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185 class BitSetIterator
00186 {
00187 public:
00188
00189 BitSetIterator();
00190
00191
00192 BitSetIterator(const BitSet& bitset);
00193
00194
00195
00196
00197 bool operator()() const;
00198
00199
00200 bool ok() const;
00201
00202
00203 void operator++();
00204
00205
00206 void operator--();
00207
00208
00209 void setpos(const int i);
00210
00211
00212 void begin();
00213
00214
00215 void end();
00216
00217 private:
00218 int m_index;
00219 int m_remainder;
00220 int m_length;
00221
00222 int m_partialBits;
00223 const BitSet* m_bitset;
00224 static BitSet emptyBitSet;
00225 };
00226
00227 inline
00228 BitSetIterator::BitSetIterator()
00229 :
00230 m_index(0),
00231 m_remainder(0),
00232 m_length(0),
00233 m_partialBits(0),
00234 m_bitset(&emptyBitSet)
00235 {
00236 }
00237
00238 inline
00239 BitSetIterator::BitSetIterator(const BitSet& a_bitset)
00240 :m_index(0), m_remainder(0), m_length(a_bitset.m_length - 1),
00241 m_partialBits(a_bitset.m_size - BITSETWORDSIZE*(a_bitset.m_length - 1)),
00242 m_bitset(&a_bitset)
00243 {
00244 if (m_partialBits == BITSETWORDSIZE)
00245 {
00246 m_partialBits = 0;
00247 m_length++;
00248 }
00249 }
00250
00251 inline
00252 bool BitSetIterator::operator()() const
00253 {
00254 return (m_bitset->m_bits[m_index] & BitSet::trueMasks[m_remainder] ) > 0;
00255 }
00256
00257 inline
00258 bool BitSetIterator::ok() const
00259 {
00260 if (m_index < m_length) return true;
00261 if (m_remainder < m_partialBits) return true;
00262 return false;
00263 }
00264
00265 inline
00266 void BitSetIterator::operator++()
00267 {
00268 ++m_remainder;
00269 if (m_remainder == BITSETWORDSIZE)
00270 {
00271 m_remainder = 0;
00272 ++m_index;
00273 }
00274 }
00275
00276 inline
00277 void BitSetIterator::operator--()
00278 {
00279 if (m_remainder == 0)
00280 {
00281 m_remainder = BITSETWORDSIZE;
00282 --m_index;
00283 }
00284 --m_remainder;
00285 }
00286
00287 inline
00288 void BitSetIterator::setpos(const int i)
00289 {
00290 m_index = i/BITSETWORDSIZE;
00291 m_remainder = i-BITSETWORDSIZE*m_index;
00292 CH_assert(ok());
00293 }
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317 class BitSetTrueIterator
00318 {
00319 public:
00320
00321
00322 BitSetTrueIterator();
00323
00324
00325 BitSetTrueIterator(const BitSet& bitset);
00326
00327
00328
00329 void define(const BitSet& a_bitset);
00330
00331
00332 int operator()() const;
00333
00334
00335 bool ok() const;
00336
00337
00338 void operator++();
00339
00340
00341 void begin();
00342
00343
00344 void end();
00345
00346 private:
00347 const BITSETWORD* m_bits;
00348 BITSETWORD m_wordCache;
00349 int m_size;
00350 int m_length;
00351 int m_pos;
00352 int m_index;
00353 };
00354
00355 inline
00356 BitSetTrueIterator::BitSetTrueIterator()
00357 :
00358 m_bits(0),
00359 m_wordCache(0),
00360 m_size(0),
00361 m_length(0),
00362 m_pos(0),
00363 m_index(0)
00364 {
00365 }
00366
00367 inline
00368 BitSetTrueIterator::BitSetTrueIterator(const BitSet& a_bitset)
00369 :
00370 m_bits(a_bitset.m_bits),
00371 m_wordCache(0),
00372 m_size(a_bitset.m_size),
00373 m_length(a_bitset.m_length)
00374 {
00375
00376 for (int i = 0; i < m_length; ++i)
00377 {
00378 if (m_bits[i] > 0)
00379 {
00380 m_index = i;
00381 this->operator++();
00382 return;
00383 }
00384 }
00385 end();
00386 }
00387
00388 inline void
00389 BitSetTrueIterator::define(const BitSet& a_bitset)
00390 {
00391 m_bits = a_bitset.m_bits;
00392 m_wordCache = 0;
00393 m_size = a_bitset.m_size;
00394 m_length = a_bitset.m_length;
00395
00396 for (int i = 0; i < m_length; ++i)
00397 {
00398 if (m_bits[i] > 0)
00399 {
00400 m_index = i;
00401 this->operator++();
00402 return;
00403 }
00404 }
00405 end();
00406 }
00407
00408 inline int
00409 BitSetTrueIterator::operator()() const
00410 {
00411 return m_pos;
00412 }
00413
00414 inline bool
00415 BitSetTrueIterator::ok() const
00416 {
00417 return (m_pos < m_size);
00418 }
00419
00420 inline void
00421 BitSetTrueIterator::operator++()
00422 {
00423 ++m_pos;
00424 if (!m_wordCache)
00425 {
00426 int i;
00427
00428
00429 for (i = m_index; i != m_length; ++i)
00430 {
00431 if (m_bits[i] > 0) break;
00432 }
00433 if (i == m_length)
00434 {
00435 m_pos = m_size;
00436 return;
00437 }
00438 m_wordCache = m_bits[i];
00439 m_pos = i*BITSETWORDSIZE;
00440 m_index = i+1;
00441
00442 }
00443 while (!(m_wordCache & BitSet::trueMasks[0]))
00444 {
00445 m_wordCache <<= 1;
00446 ++m_pos;
00447 }
00448 m_wordCache <<= 1;
00449
00450 }
00451
00452 inline void
00453 BitSetTrueIterator::begin()
00454 {
00455 m_wordCache = 0;
00456 m_index = 0;
00457 this->operator++();
00458 }
00459
00460 inline void
00461 BitSetTrueIterator::end()
00462 {
00463 m_wordCache = 0;
00464 m_index = m_length;
00465 m_pos = m_size;
00466 }
00467
00468 #include "BaseNamespaceFooter.H"
00469 #endif