1*184914b5SBarry Smith /* $Id: bitarray.h,v 1.11 1998/10/16 03:15:04 bsmith Exp bsmith $ */ 2bd3dcc6dSSatish Balay 319fee000SSatish Balay /* 419fee000SSatish Balay 53b71518fSBarry Smith BT - Bit array objects: used to compactly store logical arrays of variables. 619fee000SSatish Balay 73b71518fSBarry Smith BTCreate(m,bt) - creates a bit array with enough room to hold m values 83b71518fSBarry Smith BTDestroy(bt) - destroys the bit array 9eec0b4cfSBarry Smith BTMemzero(m,bt) - zeros the entire bit array (sets all values to false) 103b71518fSBarry Smith BTSet(bt,index) - sets a particular entry as true 113b71518fSBarry Smith BTClear(bt,index) - sets a particular entry as false 123b71518fSBarry Smith BTLookup(bt,index) - returns the value 133b71518fSBarry Smith BTLookupSet(bt,index) - returns the value and then sets it true 14eec0b4cfSBarry Smith BTLength(m) - returns number of bytes in array with m bits 15eec0b4cfSBarry Smith BTView(m,bt) - prints all the entries in a bit array 16eec0b4cfSBarry Smith 17eec0b4cfSBarry Smith These routines do not currently have manual pages. 18eec0b4cfSBarry Smith 19eec0b4cfSBarry Smith The are all implemented as macros with the trivial data structure for efficiency. 20eec0b4cfSBarry Smith 21eec0b4cfSBarry Smith These are not thread safe since they use a few global variables. 2219fee000SSatish Balay 2319fee000SSatish Balay */ 24ca71c51bSBarry Smith #if !defined(__BITARRAY_H) 253b71518fSBarry Smith #define __BITARRAY_H 26ca71c51bSBarry Smith 27e2e5485fSSatish Balay #if !defined(BITSPERBYTE) 28e2e5485fSSatish Balay #define BITSPERBYTE 8 29e2e5485fSSatish Balay #endif 30e2e5485fSSatish Balay 31ca71c51bSBarry Smith typedef char* BT; 32ca71c51bSBarry Smith 331a89f835SSatish Balay extern char _BT_mask, _BT_c; 3435c17c5bSBarry Smith extern int _BT_idx; 35ca71c51bSBarry Smith 363b71518fSBarry Smith #define BTView(m,bt) {\ 373b71518fSBarry Smith int __i; \ 383b71518fSBarry Smith for (__i=0; __i<m; __i++) { \ 393b71518fSBarry Smith printf("%d %d\n",__i,BTLookup(bt,__i)); \ 403b71518fSBarry Smith }} 413b71518fSBarry Smith 423b71518fSBarry Smith #define BTLength(m) ((m)/BITSPERBYTE+1)*sizeof(char) 433b71518fSBarry Smith 44ca71c51bSBarry Smith #define BTCreate(m,array) (array = (char *)PetscMalloc(((m)/BITSPERBYTE+1)*sizeof(char)),\ 45ca71c51bSBarry Smith ( !array ) ? 1 : (BTMemzero(m,array),0) ) 46ca71c51bSBarry Smith 47f155196cSSatish Balay #define BTMemzero(m,array) PetscMemzero(array,(m)/BITSPERBYTE+1) 48ca71c51bSBarry Smith 49ca71c51bSBarry Smith #define BTLookupSet(array, index) (_BT_idx = (index)/BITSPERBYTE, \ 5019fee000SSatish Balay _BT_c = array[_BT_idx], \ 511a89f835SSatish Balay _BT_mask = (char)1 << ((index)%BITSPERBYTE), \ 521a89f835SSatish Balay array[_BT_idx] = _BT_c | _BT_mask, \ 531a89f835SSatish Balay _BT_c & _BT_mask ) 5419fee000SSatish Balay 55ca71c51bSBarry Smith #define BTSet(array, index) (_BT_idx = (index)/BITSPERBYTE, \ 56ca71c51bSBarry Smith _BT_c = array[_BT_idx], \ 571a89f835SSatish Balay _BT_mask = (char)1 << ((index)%BITSPERBYTE), \ 581a89f835SSatish Balay array[_BT_idx] = _BT_c | _BT_mask,0) 5919fee000SSatish Balay 60ca71c51bSBarry Smith 61ca71c51bSBarry Smith #define BTClear(array, index) (_BT_idx = (index)/BITSPERBYTE, \ 62ca71c51bSBarry Smith _BT_c = array[_BT_idx], \ 631a89f835SSatish Balay _BT_mask = (char)1 << ((index)%BITSPERBYTE), \ 641a89f835SSatish Balay array[_BT_idx] = _BT_c & (~_BT_mask),0) 65ca71c51bSBarry Smith 66ca71c51bSBarry Smith #define BTLookup(array, index) (_BT_idx = (index)/BITSPERBYTE, \ 67ca71c51bSBarry Smith _BT_c = array[_BT_idx], \ 681a89f835SSatish Balay _BT_mask = (char)1 << ((index)%BITSPERBYTE), \ 691a89f835SSatish Balay (_BT_c & _BT_mask) != 0 ) 70ca71c51bSBarry Smith 71*184914b5SBarry Smith #define BTDestroy(array) PetscFree(array) 72ca71c51bSBarry Smith 73ca71c51bSBarry Smith #endif 74*184914b5SBarry Smith 75*184914b5SBarry Smith 76