NGSolve
4.9
|
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 (); 00046 00048 NGS_DLL_HEADER void Clear (); 00049 00051 void Set (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 (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 (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[] (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 private: 00110 unsigned char Mask (int i) const 00111 { return char(1) << (i % CHAR_BIT); } 00112 00114 int Addr (int i) const 00115 { return (i / CHAR_BIT); } 00116 00117 00118 }; 00119 00120 00122 NGS_DLL_HEADER ostream & operator<<(ostream & s, const BitArray & ba); 00123 00124 00125 } 00126 00127 #endif