00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #ifndef cxx_sparse_bv_INCLUDED
00042 #define cxx_sparse_bv_INCLUDED
00043
00044 #include <vector>
00045
00046 using std::vector;
00047
00048 #define mUINT64_BIT 64 // number of bits in an mUINT64
00049
00050 class SPARSE_BV
00051 {
00052 private:
00053
00054
00055
00056
00057 typedef vector<UINT32> SPARSE_BV_BUFFER;
00058 typedef SPARSE_BV_BUFFER::iterator BUFFER_ITER;
00059
00060 typedef vector<mUINT64> SPARSE_BV_DATA;
00061
00062 private:
00063 SPARSE_BV_BUFFER* buffer;
00064 SPARSE_BV_DATA* data;
00065 private:
00066
00067
00068 void Set_Bit (UINT32 index);
00069
00070
00071 void Union_2_Core (const SPARSE_BV& vec, BUFFER_ITER vec_iter,
00072 BUFFER_ITER iter);
00073
00074
00075 BOOL Union_2_Diff_Core (const SPARSE_BV& vec);
00076
00077 public:
00078
00079 SPARSE_BV () : buffer (NULL) {}
00080
00081 SPARSE_BV (const SPARSE_BV& bv) {
00082 if (bv.buffer) {
00083 buffer = CXX_NEW (SPARSE_BV_BUFFER (*bv.buffer), Malloc_Mem_Pool);
00084 data = CXX_NEW (SPARSE_BV_DATA (*bv.data), Malloc_Mem_Pool);
00085 } else {
00086 buffer = NULL;
00087 data = NULL;
00088 }
00089 }
00090
00091 ~SPARSE_BV () {
00092 if (buffer != 0) {
00093 CXX_DELETE (data, Malloc_Mem_Pool);
00094 CXX_DELETE (buffer, Malloc_Mem_Pool);
00095 }
00096 }
00097
00098
00099 void Set (UINT32 index) {
00100 if (buffer && index < buffer->size () * mUINT64_BIT) {
00101 UINT32 idx = (*buffer)[index / mUINT64_BIT];
00102 if (idx != 0) {
00103 (*data)[idx] |= 1LL << (index % mUINT64_BIT);
00104 return;
00105 }
00106 }
00107
00108
00109 Set_Bit (index);
00110 }
00111
00112
00113 BOOL Is_Set (UINT32 index) const {
00114 if (buffer == NULL || index >= buffer->size () * mUINT64_BIT)
00115 return FALSE;
00116 UINT32 idx = (*buffer)[index / mUINT64_BIT];
00117 if (idx == 0)
00118 return FALSE;
00119 return ((*data)[idx] & (1LL << (index % mUINT64_BIT))) != 0LL;
00120 }
00121
00122
00123
00124 void Union_2 (const SPARSE_BV& vec);
00125
00126
00127 BOOL Union_2_diff (const SPARSE_BV& vec) {
00128 if (vec.buffer == NULL)
00129 return FALSE;
00130 else if (buffer != NULL) {
00131 return Union_2_Diff_Core (vec);
00132 } else {
00133 Union_2 (vec);
00134 return TRUE;
00135 }
00136 }
00137
00138 #ifdef Is_True_On
00139
00140
00141
00142 void Verify () const;
00143
00144
00145
00146 UINT32 Memory_Size () const {
00147 if (buffer == NULL)
00148 return 0;
00149 return buffer->size() * sizeof(UINT32) + data->size() * sizeof(mUINT64);
00150 }
00151
00152 void Print (FILE* f) const {
00153 if (buffer == NULL)
00154 return;
00155 fprintf (f, "Size = %d\n", Memory_Size ());
00156 UINT32 index = 0;
00157 for (BUFFER_ITER first (buffer->begin ()); first != buffer->end ();
00158 ++first) {
00159 if (*first != 0) {
00160 fprintf (f, "0x%x: %016llx\n", index, (*data)[*first]);
00161 }
00162 index += mUINT64_BIT;
00163 }
00164 }
00165 #endif
00166 };
00167
00168
00169 #endif // cxx_sparse_bv_INCLUDED