00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #define WORD unsigned int
00038 const int WORDSIZE = 8*sizeof(unsigned int);
00039
00040
00041 #include <assert.h>
00042 #include <iostream>
00043
00044 using std::ostream;
00045
00046
00047 class BitSetIterator;
00048
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 class BitSet
00077 {
00078 public:
00080 BitSet();
00081
00083 BitSet(int bits, bool init);
00084
00086 void define(int bits, bool init);
00087
00089 BitSet(const BitSet& rhs);
00090
00092 BitSet& operator=(const BitSet& rhs);
00093
00095 ~BitSet();
00096
00097
00098
00099 bool operator[](int i) const;
00100
00101
00102
00103
00104
00106 void setTrue(int i);
00107
00109 void setFalse(int i);
00110
00112
00115 bool isEmpty() const;
00116
00118
00121 bool isFull() const;
00122
00124 int size() const;
00125 static int initialize();
00126
00127
00128 static long int bytes;
00129 static long int peak;
00130
00131 private:
00132 friend class BitSetIterator;
00133
00134 WORD* m_bits;
00135 int m_size;
00136 int m_length;
00137
00138 static WORD trueMasks[WORDSIZE];
00139 };
00140
00141
00142
00143 inline bool BitSet::operator[](int i) const
00144 {
00145 assert(i>=0);
00146 assert(i<m_size);
00147 int index = i/WORDSIZE;
00148 assert(index < m_length);
00149 int remainder = i-WORDSIZE*index;
00150 WORD tmp = m_bits[index] & trueMasks[remainder];
00151 return tmp > 0;
00152 }
00153
00154 inline int BitSet::size() const
00155 {
00156 return m_size;
00157 }
00158
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176 class BitSetIterator
00177 {
00178 public:
00180 BitSetIterator();
00181
00183 BitSetIterator(const BitSet& bitset);
00184
00185
00186
00188 bool operator()() const;
00189
00191 bool ok() const;
00192
00194 void operator++();
00195
00197 void begin();
00198
00200 void end();
00201
00202 private:
00203 int m_index;
00204 int m_remainder;
00205 int m_length;
00206
00207 int m_partialBits;
00208 const BitSet* m_bitset;
00209 static BitSet emptyBitSet;
00210 };
00211
00212 inline
00213 BitSetIterator::BitSetIterator()
00214 : m_index(0), m_remainder(0), m_length(0), m_partialBits(0), m_bitset(&emptyBitSet)
00215 {;}
00216
00217 inline
00218 BitSetIterator::BitSetIterator(const BitSet& a_bitset)
00219 :m_index(0), m_remainder(0), m_length(a_bitset.m_length - 1),
00220 m_partialBits(a_bitset.m_size - WORDSIZE*(a_bitset.m_length - 1)),
00221 m_bitset(&a_bitset)
00222 {
00223 if(m_partialBits == WORDSIZE)
00224 {
00225 m_partialBits = 0;
00226 m_length++;
00227 }
00228 }
00229
00230 inline
00231 bool BitSetIterator::operator()() const
00232 {
00233 return (m_bitset->m_bits[m_index] & BitSet::trueMasks[m_remainder] ) > 0;
00234 }
00235
00236 inline
00237 bool BitSetIterator::ok() const
00238 {
00239 if(m_index < m_length) return true;
00240 if(m_remainder < m_partialBits) return true;
00241 return false;
00242 }
00243
00244 inline
00245 void BitSetIterator::operator++()
00246 {
00247 ++m_remainder;
00248 if(m_remainder == WORDSIZE)
00249 {
00250 m_remainder = 0;
00251 ++m_index;
00252 }
00253 }