00001 #ifndef BITMAP_H
00002 #define BITMAP_H
00003 #include<assert.h>
00004 #include<iostream.h>
00005
00006
00007 typedef unsigned long index_t;
00008
00014 class BitMap
00015 {
00016 size_t len;
00017 unsigned long f[1];
00018 public:
00019 void init(int plen) { len=plen>>5; for(index_t i=0;i<len;i++) f[i]=0; }
00020 size_t size() { return sizeof(size_t)+len*sizeof(unsigned long); }
00021 size_t length() { return len; }
00022 bool is_set(index_t i)
00023 { assert((i>>5)<len); return f[i>>5]&(1<<(i&31)); }
00024 void set(index_t i,bool w)
00025 { assert((i>>5)<len);
00026 unsigned long m = (1<<(i&31));
00027 if(w) { f[i>>5] |= m; } else { f[i>>5] &= ~m; }
00028 }
00029
00031 index_t find0()
00032 {
00033 index_t i=0;
00034 unsigned short j;
00035 unsigned short o=0;
00036 while(i < len && f[i] == ~0u) i++;
00037 assert(i < len);
00038 o=0;
00039 while(((0xfu << o)&f[i])==(0xfu<<o) && o < 32u) o+=4;
00040 for(j=o;j<o+4;j++)
00041 {
00042 if(!((1<<j)&f[i])) return((i<<5) + j);
00043 }
00044 assert(0);
00045 return (~0);
00046 }
00047 };
00048
00049 inline void druckebelegtliste(ostream &str,BitMap &bm)
00050 {
00051 for(index_t i=0;i<bm.length();i++)
00052 {
00053 if(bm.is_set(i)) str << (i>0 ? " ," : "") << i;
00054 }
00055 str << endl;
00056 };
00057 #endif
00058
00059
00060
00061