NGSolve  5.3
ngstd/bitarray.hpp
00001 #ifndef FILE_NGS_BITArray
00002 #define FILE_NGS_BITArray
00003 
00004 /**************************************************************************/
00005 /* File:   bitarray.hpp                                                   */
00006 /* Author: Joachim Schoeberl                                              */
00007 /* Date:   01. Jun. 95                                                    */
00008 /**************************************************************************/
00009 
00010 
00011 namespace ngstd
00012 {
00013 
00019 class BitArray
00020 {
00022   int size;
00023 
00025   unsigned char * data;
00026 public:
00028   NGS_DLL_HEADER BitArray ();
00030   NGS_DLL_HEADER BitArray (int asize);
00032   NGS_DLL_HEADER BitArray (const BitArray & ba2);
00034   NGS_DLL_HEADER ~BitArray ();
00035 
00037   NGS_DLL_HEADER void SetSize (int asize);
00038 
00040   int Size () const
00041   { return size; }
00042 
00043 
00045   NGS_DLL_HEADER void Set () throw();
00046 
00048   NGS_DLL_HEADER void Clear () throw();
00049 
00051   void Set (unsigned int i)
00052   {
00053 #ifdef DEBUG
00054     if (i < 0 || i >= size)
00055       throw RangeException ("Bitarray::Set", i, 0, size-1);
00056 #endif
00057     unsigned char * p = data+Addr(i);
00058     unsigned char mask = Mask(i);
00059 
00060 #pragma omp atomic
00061     (*p) |= mask;
00062     // data[Addr(i)] |= Mask(i); 
00063   }
00064 
00066   void Clear (unsigned int i)
00067   { 
00068 #ifdef DEBUG
00069     if (i < 0 || i >= size)
00070       throw RangeException ("Bitarray::Clear", i, 0, size-1);
00071 #endif
00072     data[Addr(i)] &= ~Mask(i); 
00073   }
00074 
00076   bool Test (unsigned int i) const
00077   {
00078     return (data[i / CHAR_BIT] & (char(1) << (i % CHAR_BIT) ) ) ? 1 : 0;
00079   }
00080 
00082   BitArray & operator= (bool b)
00083   {
00084     if (b) Set();
00085     else   Clear();
00086     return *this;
00087   }
00088   
00090   bool operator[] (unsigned int i) const
00091   {
00092     return (data[i / CHAR_BIT] & (char(1) << (i % CHAR_BIT) ) ) ? 1 : 0;
00093   }
00094 
00095   
00097   NGS_DLL_HEADER void Invert ();
00098 
00100   NGS_DLL_HEADER void And (const BitArray & ba2);
00101 
00103   NGS_DLL_HEADER void Or (const BitArray & ba2);
00104 
00106   NGS_DLL_HEADER BitArray & operator= (const BitArray & ba2);
00107 
00108   int NumSet () const;
00109 private:
00111   unsigned char Mask (unsigned int i) const
00112   { return char(1) << (i % CHAR_BIT); }
00113     
00115   int Addr (unsigned int i) const
00116   { return (i / CHAR_BIT); }
00117 
00118 
00119 };
00120 
00121 
00123 NGS_DLL_HEADER ostream & operator<<(ostream & s, const BitArray & ba);
00124 
00125   extern Archive & operator & (Archive & archive, BitArray & ba);
00126 
00127 }
00128 
00129 #endif