Actual source code: petscbt.h
1: /*
3: BT - Bit array objects: used to compactly store logical arrays of variables.
5: PetscBTCreate(m,bt) - creates a bit array with enough room to hold m values
6: PetscBTDestroy(bt) - destroys the bit array
7: PetscBTMemzero(m,bt) - zeros the entire bit array (sets all values to false)
8: PetscBTSet(bt,index) - sets a particular entry as true
9: PetscBTClear(bt,index) - sets a particular entry as false
10: PetscBTLookup(bt,index) - returns the value
11: PetscBTLookupSet(bt,index) - returns the value and then sets it true
12: PetscBTLength(m) - returns number of bytes in array with m bits
13: PetscBTView(m,bt,viewer) - prints all the entries in a bit array
15: These routines do not currently have manual pages.
17: The are all implemented as macros with the trivial data structure for efficiency.
19: These are not thread safe since they use a few global variables.
21: We do not currently check error flags on PetscBTSet(), PetscBTClear(), PetscBTLookup(),
22: PetcBTLookupSet(), PetscBTLength() cause error checking would cost hundreds more cycles then
23: the operation.
25: */
30: /*S
31: PetscBT - PETSc bitarrays
33: Level: advanced
35: Notes: the PetscBT routines do not currently have manual pages. See include/petscbt.h for
36: documentation
38: .seealso: PetscBTCreate(), PetscBTDestroy(), PetscBTMemzero(), PetscBTSet(), PetscBTClear(),
39: PetscBTLookup(), PetscBTLookupSet(), PetscBTLength(), PetscBTView()
40: S*/
41: typedef char* PetscBT;
46: #define PetscBTLength(m) ((m)/PETSC_BITS_PER_BYTE+1)
47: #define PetscBTMemzero(m,array) PetscMemzero(array,sizeof(char)*((m)/PETSC_BITS_PER_BYTE+1))
48: #define PetscBTDestroy(array) PetscFree(array)
50: #define PetscBTView(m,bt,viewer) 0; {\
51: PetscInt __i; PetscErrorCode_8_ierr; \
52: PetscViewer __viewer = viewer; \
53: if (!__viewer) __viewer = PETSC_VIEWER_STDOUT_SELF;\
54: for (__i=0; __i<m; __i++) { \
55: _8_PetscPrintf(((PetscObject)__viewer)->comm,"%D %d\n",__i,PetscBTLookup(bt,__i));CHKERRQ(_8_ierr);\
56: }}
58: #define PetscBTCreate(m,array) \
59: (PetscMalloc(((m)/PETSC_BITS_PER_BYTE+1)*sizeof(char),&(array)) || PetscBTMemzero(m,array))
61: #define PetscBTLookupSet(array,index) (_BT_idx = (index)/PETSC_BITS_PER_BYTE, \
62: _BT_c = array[_BT_idx], \
63: _BT_mask = (char)1 << ((index)%PETSC_BITS_PER_BYTE), \
64: array[_BT_idx] = _BT_c | _BT_mask, \
65: _BT_c & _BT_mask)
67: #define PetscBTSet(array,index) (_BT_idx = (index)/PETSC_BITS_PER_BYTE, \
68: _BT_c = array[_BT_idx], \
69: _BT_mask = (char)1 << ((index)%PETSC_BITS_PER_BYTE), \
70: array[_BT_idx] = _BT_c | _BT_mask,0)
73: #define PetscBTClear(array,index) (_BT_idx = (index)/PETSC_BITS_PER_BYTE, \
74: _BT_c = array[_BT_idx], \
75: _BT_mask = (char)1 << ((index)%PETSC_BITS_PER_BYTE), \
76: array[_BT_idx] = _BT_c & (~_BT_mask),0)
78: #define PetscBTLookup(array,index) (_BT_idx = (index)/PETSC_BITS_PER_BYTE, \
79: _BT_c = array[_BT_idx], \
80: _BT_mask = (char)1 << ((index)%PETSC_BITS_PER_BYTE), \
81: (_BT_c & _BT_mask) != 0)
84: #endif