xref: /petsc/include/petscbt.h (revision ca71c51b6c50659252e8422cb4efb569777e0fb9)
1*ca71c51bSBarry Smith /* $Id: bitarray.h,v 1.5 1996/02/05 15:21:03 balay Exp bsmith $ */
2bd3dcc6dSSatish Balay 
319fee000SSatish Balay /*
4*ca71c51bSBarry 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:
21*ca71c51bSBarry Smith           The bit operations are equivalent to:
22*ca71c51bSBarry Smith               1: retval = array[index];
2319fee000SSatish Balay               2: array[index] = 1;
2419fee000SSatish Balay               3: return retval;
2519fee000SSatish Balay */
26*ca71c51bSBarry Smith #if !defined(__BITARRAY_H)
27*ca71c51bSBarry Smith 
28e2e5485fSSatish Balay #if !defined(BITSPERBYTE)
29e2e5485fSSatish Balay #define BITSPERBYTE 8
30e2e5485fSSatish Balay #endif
31e2e5485fSSatish Balay 
32*ca71c51bSBarry Smith typedef char*  BT;
33*ca71c51bSBarry Smith 
3419fee000SSatish Balay static char _mask, _BT_c;
3519fee000SSatish Balay static int  _BT_idx;
36*ca71c51bSBarry Smith 
37*ca71c51bSBarry Smith #define BTCreate(m,array) (array = (char *)PetscMalloc(((m)/BITSPERBYTE+1)*sizeof(char)),\
38*ca71c51bSBarry Smith                            ( !array ) ? 1 : (BTMemzero(m,array),0) )
39*ca71c51bSBarry Smith 
40*ca71c51bSBarry Smith #define BTMemzero(m,array) PetscMemzero(array,(m)/BITSPERBYTE)
41*ca71c51bSBarry Smith 
42*ca71c51bSBarry Smith #define BTLookupSet(array, index)    (_BT_idx         = (index)/BITSPERBYTE, \
4319fee000SSatish Balay                                         _BT_c           = array[_BT_idx], \
44*ca71c51bSBarry Smith                                         _mask           = (char)1 << ((index)%BITSPERBYTE), \
4519fee000SSatish Balay                                         array[_BT_idx]  = _BT_c|_mask, \
4619fee000SSatish Balay                                         _BT_c & _mask )
4719fee000SSatish Balay 
48*ca71c51bSBarry Smith #define BTSet(array, index)    (_BT_idx         = (index)/BITSPERBYTE, \
49*ca71c51bSBarry Smith                                  _BT_c           = array[_BT_idx], \
50*ca71c51bSBarry Smith                                  _mask           = (char)1 << ((index)%BITSPERBYTE), \
51*ca71c51bSBarry Smith                                  array[_BT_idx]  = _BT_c|_mask,0)
5219fee000SSatish Balay 
53*ca71c51bSBarry Smith 
54*ca71c51bSBarry Smith #define BTClear(array, index)  (_BT_idx         = (index)/BITSPERBYTE, \
55*ca71c51bSBarry Smith                                  _BT_c           = array[_BT_idx], \
56*ca71c51bSBarry Smith                                  _mask           = (char)1 << ((index)%BITSPERBYTE), \
57*ca71c51bSBarry Smith                                  array[_BT_idx]  = _BT_c & (~_mask),0)
58*ca71c51bSBarry Smith 
59*ca71c51bSBarry Smith #define BTLookup(array, index) (_BT_idx         = (index)/BITSPERBYTE, \
60*ca71c51bSBarry Smith                                  _BT_c           = array[_BT_idx], \
61*ca71c51bSBarry Smith                                  _mask           = (char)1 << ((index)%BITSPERBYTE), \
62*ca71c51bSBarry Smith                                  _BT_c & _mask )
63*ca71c51bSBarry Smith 
64*ca71c51bSBarry Smith 
65*ca71c51bSBarry Smith #define BTDestroy(array) (PetscFree(array),0)
66*ca71c51bSBarry Smith 
67*ca71c51bSBarry Smith #endif
68