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 "BaseNamespaceHeader.H"
00027
00028 #define BITSETWORD unsigned int
00029 const int BITSETWORDSIZE = 8*sizeof(unsigned int);
00030
00031
00032 using std::ostream;
00033
00034 class BitSetIterator;
00035
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 class BitSet
00064 {
00065 public:
00067 BitSet();
00068
00070 BitSet(int bits, bool init);
00071
00073 void define(int bits, bool init);
00074
00076 BitSet(const BitSet& rhs);
00077
00079 BitSet& operator=(const BitSet& rhs);
00080
00082
00087 bool operator<(const BitSet& rhs) const;
00088
00090 ~BitSet();
00091
00092
00093
00094 bool operator[](int i) const;
00095
00096
00097
00098
00099
00101 void setTrue(int i);
00102
00104 void setFalse(int i);
00105
00107
00110 bool isEmpty() const;
00111
00113
00116 bool isFull() const;
00117
00119 int size() const;
00120 static int initialize();
00121
00122 int linearSize() const;
00123
00124 void linearIn(const void* const inBuf);
00125
00126 void linearOut(void* const a_outBuf) const;
00127
00128
00129 static long int bytes;
00130 static long int peak;
00131
00132 private:
00133 friend class BitSetIterator;
00134
00135 BITSETWORD* m_bits;
00136 int m_size;
00137 int m_length;
00138
00139 static BITSETWORD trueMasks[BITSETWORDSIZE];
00140 };
00141
00142
00143
00144 inline bool BitSet::operator[](int i) const
00145 {
00146 CH_assert(i>=0);
00147 CH_assert(i<m_size);
00148 int index = i/BITSETWORDSIZE;
00149 CH_assert(index < m_length);
00150 int remainder = i-BITSETWORDSIZE*index;
00151 BITSETWORD tmp = m_bits[index] & trueMasks[remainder];
00152 return tmp > 0;
00153 }
00154
00155 inline int BitSet::size() const
00156 {
00157 return m_size;
00158 }
00159
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177 class BitSetIterator
00178 {
00179 public:
00181 BitSetIterator();
00182
00184 BitSetIterator(const BitSet& bitset);
00185
00186
00187
00189 bool operator()() const;
00190
00192 bool ok() const;
00193
00195 void operator++();
00196
00198 void begin();
00199
00201 void end();
00202
00203 private:
00204 int m_index;
00205 int m_remainder;
00206 int m_length;
00207
00208 int m_partialBits;
00209 const BitSet* m_bitset;
00210 static BitSet emptyBitSet;
00211 };
00212
00213 inline
00214 BitSetIterator::BitSetIterator()
00215 :
00216 m_index(0),
00217 m_remainder(0),
00218 m_length(0),
00219 m_partialBits(0),
00220 m_bitset(&emptyBitSet)
00221 {}
00222
00223 inline
00224 BitSetIterator::BitSetIterator(const BitSet& a_bitset)
00225 :m_index(0), m_remainder(0), m_length(a_bitset.m_length - 1),
00226 m_partialBits(a_bitset.m_size - BITSETWORDSIZE*(a_bitset.m_length - 1)),
00227 m_bitset(&a_bitset)
00228 {
00229 if(m_partialBits == BITSETWORDSIZE)
00230 {
00231 m_partialBits = 0;
00232 m_length++;
00233 }
00234 }
00235
00236 inline
00237 bool BitSetIterator::operator()() const
00238 {
00239 return (m_bitset->m_bits[m_index] & BitSet::trueMasks[m_remainder] ) > 0;
00240 }
00241
00242 inline
00243 bool BitSetIterator::ok() const
00244 {
00245 if(m_index < m_length) return true;
00246 if(m_remainder < m_partialBits) return true;
00247 return false;
00248 }
00249
00250 inline
00251 void BitSetIterator::operator++()
00252 {
00253 ++m_remainder;
00254 if(m_remainder == BITSETWORDSIZE)
00255 {
00256 m_remainder = 0;
00257 ++m_index;
00258 }
00259 }
00260
00261 #include "BaseNamespaceFooter.H"
00262 #endif