Hauptseite   Klassenhierarchie   Übersicht   Auflistung der Dateien   Elementübersicht  

bitmap.h

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;          // anzahl
00017   unsigned long f[1];  // 32 bit 
00018  public: // 32=1<<5; 31=(1<<5)-1;
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 

Erzeugt am Thu Jul 18 21:37:40 2002 für rams_metaobj von doxygen1.2.12 geschrieben von Dimitri van Heesch, © 1997-2001