xref: /petsc/include/petscbt.h (revision f155196cb5f7b64ff06d36e595d7c9f3397a4d91)
1*f155196cSSatish Balay /* $Id: bitarray.h,v 1.6 1997/10/01 22:43:45 bsmith Exp balay $ */
2bd3dcc6dSSatish Balay 
319fee000SSatish Balay /*
4ca71c51bSBarry Smith       BTSet - Expexts a charecter array -'array' as input, and
519fee000SSatish Balay       treats it as  an array of bits. It Checks if a given bit location
619fee000SSatish Balay       ( specified by 'index') is marked, and later marks that location.
719fee000SSatish Balay 
819fee000SSatish Balay       Input:
919fee000SSatish Balay       array  - an array of char. Initially all bits are to be set to zero
1019fee000SSatish Balay                by using PetscMemzero().
1119fee000SSatish Balay       index  - specifies the index of the required bit in the bit array.
1219fee000SSatish Balay 
1319fee000SSatish Balay       Output:
1419fee000SSatish Balay       return val - 0 if the bit is not found,
1519fee000SSatish Balay                  - nonzero if found.
1619fee000SSatish Balay 
1719fee000SSatish Balay       Usage :
1819fee000SSatish Balay       BT_LOOKUP(char * array,  int index) ;
1919fee000SSatish Balay 
2019fee000SSatish Balay       Summary:
21ca71c51bSBarry Smith           The bit operations are equivalent to:
22ca71c51bSBarry Smith               1: retval = array[index];
2319fee000SSatish Balay               2: array[index] = 1;
2419fee000SSatish Balay               3: return retval;
2519fee000SSatish Balay */
26ca71c51bSBarry Smith #if !defined(__BITARRAY_H)
27ca71c51bSBarry Smith 
28e2e5485fSSatish Balay #if !defined(BITSPERBYTE)
29e2e5485fSSatish Balay #define BITSPERBYTE 8
30e2e5485fSSatish Balay #endif
31e2e5485fSSatish Balay 
32ca71c51bSBarry Smith typedef char*  BT;
33ca71c51bSBarry Smith 
3419fee000SSatish Balay static char _mask, _BT_c;
3519fee000SSatish Balay static int  _BT_idx;
36ca71c51bSBarry Smith 
37ca71c51bSBarry Smith #define BTCreate(m,array) (array = (char *)PetscMalloc(((m)/BITSPERBYTE+1)*sizeof(char)),\
38ca71c51bSBarry Smith                            ( !array ) ? 1 : (BTMemzero(m,array),0) )
39ca71c51bSBarry Smith 
40*f155196cSSatish Balay #define BTMemzero(m,array) PetscMemzero(array,(m)/BITSPERBYTE+1)
41ca71c51bSBarry Smith 
42ca71c51bSBarry Smith #define BTLookupSet(array, index)    (_BT_idx         = (index)/BITSPERBYTE, \
4319fee000SSatish Balay                                         _BT_c           = array[_BT_idx], \
44ca71c51bSBarry Smith                                         _mask           = (char)1 << ((index)%BITSPERBYTE), \
4519fee000SSatish Balay                                         array[_BT_idx]  = _BT_c | _mask, \
4619fee000SSatish Balay                                         _BT_c & _mask )
4719fee000SSatish Balay 
48ca71c51bSBarry Smith #define BTSet(array, index)    (_BT_idx         = (index)/BITSPERBYTE, \
49ca71c51bSBarry Smith                                  _BT_c           = array[_BT_idx], \
50ca71c51bSBarry Smith                                  _mask           = (char)1 << ((index)%BITSPERBYTE), \
51ca71c51bSBarry Smith                                  array[_BT_idx]  = _BT_c | _mask,0)
5219fee000SSatish Balay 
53ca71c51bSBarry Smith 
54ca71c51bSBarry Smith #define BTClear(array, index)  (_BT_idx         = (index)/BITSPERBYTE, \
55ca71c51bSBarry Smith                                  _BT_c           = array[_BT_idx], \
56ca71c51bSBarry Smith                                  _mask           = (char)1 << ((index)%BITSPERBYTE), \
57ca71c51bSBarry Smith                                  array[_BT_idx]  = _BT_c & (~_mask),0)
58ca71c51bSBarry Smith 
59ca71c51bSBarry Smith #define BTLookup(array, index) (_BT_idx         = (index)/BITSPERBYTE, \
60ca71c51bSBarry Smith                                  _BT_c           = array[_BT_idx], \
61ca71c51bSBarry Smith                                  _mask           = (char)1 << ((index)%BITSPERBYTE), \
62ca71c51bSBarry Smith                                  _BT_c & _mask )
63ca71c51bSBarry Smith 
64ca71c51bSBarry Smith 
65ca71c51bSBarry Smith #define BTDestroy(array) (PetscFree(array),0)
66ca71c51bSBarry Smith 
67ca71c51bSBarry Smith #endif
68