Actual source code: petscbt.h
1: /* $Id: petscbt.h,v 1.22 2001/09/07 20:13:16 bsmith Exp $ */
3: /*
5: BT - Bit array objects: used to compactly store logical arrays of variables.
7: PetscBTCreate(m,bt) - creates a bit array with enough room to hold m values
8: PetscBTDestroy(bt) - destroys the bit array
9: PetscBTMemzero(m,bt) - zeros the entire bit array (sets all values to false)
10: PetscBTSet(bt,index) - sets a particular entry as true
11: PetscBTClear(bt,index) - sets a particular entry as false
12: PetscBTLookup(bt,index) - returns the value
13: PetscBTLookupSet(bt,index) - returns the value and then sets it true
14: PetscBTLength(m) - returns number of bytes in array with m bits
15: PetscBTView(m,bt,viewer) - prints all the entries in a bit array
17: These routines do not currently have manual pages.
19: The are all implemented as macros with the trivial data structure for efficiency.
21: These are not thread safe since they use a few global variables.
23: We do not currently check error flags on PetscBTSet(), PetscBTClear(), PetscBTLookup(),
24: PetcBTLookupSet(), PetscBTLength() cause error checking would cost hundreds more cycles then
25: the operation.
27: */
31: /*S
32: PetscBT - PETSc bitarrays
34: Level: advanced
36: Notes: the PetscBT routines do not currently have manual pages. See include/petscbt.h for
37: documentation
39: .seealso: PetscBTCreate(), PetscBTDestroy(), PetscBTMemzero(), PetscBTSet(), PetscBTClear(),
40: PetscBTLookup(), PetscBTLookupSet(), PetscBTLength(), PetscBTView()
41: S*/
42: typedef char* PetscBT;
44: extern char _BT_mask,_BT_c;
45: extern int _BT_idx;
47: #define PetscBTLength(m) ((m)/PETSC_BITS_PER_BYTE+1)*sizeof(char)
48: #define PetscBTMemzero(m,array) PetscMemzero(array,(m)/PETSC_BITS_PER_BYTE+1)
49: #define PetscBTDestroy(array) PetscFree(array)
51: #define PetscBTView(m,bt,viewer) 0; {
52: int __i,_8_ierr;
53: PetscViewer __viewer = viewer;
54: if (!__viewer) __viewer = PETSC_VIEWER_STDOUT_SELF;
55: for (__i=0; __i<m; __i++) {
56: _8_PetscPrintf(((PetscObject)__viewer)->comm,"%d %dn",__i,PetscBTLookup(bt,__i));CHKERRQ(_8_ierr);
57: }}
59: #define PetscBTCreate(m,array) 0; {
60: int _9_ierr;
61: _9_PetscMalloc(((m)/PETSC_BITS_PER_BYTE+1)*sizeof(char),&(array));CHKERRQ(_9_ierr);
62: _9_PetscBTMemzero(m,array);CHKERRQ(_9_ierr);
63: }
65: #define PetscBTLookupSet(array,index) (_BT_idx = (index)/PETSC_BITS_PER_BYTE,
66: _BT_c = array[_BT_idx],
67: _BT_mask = (char)1 << ((index)%PETSC_BITS_PER_BYTE),
68: array[_BT_idx] = _BT_c | _BT_mask,
69: _BT_c & _BT_mask)
71: #define PetscBTSet(array,index) (_BT_idx = (index)/PETSC_BITS_PER_BYTE,
72: _BT_c = array[_BT_idx],
73: _BT_mask = (char)1 << ((index)%PETSC_BITS_PER_BYTE),
74: array[_BT_idx] = _BT_c | _BT_mask,0)
77: #define PetscBTClear(array,index) (_BT_idx = (index)/PETSC_BITS_PER_BYTE,
78: _BT_c = array[_BT_idx],
79: _BT_mask = (char)1 << ((index)%PETSC_BITS_PER_BYTE),
80: array[_BT_idx] = _BT_c & (~_BT_mask),0)
82: #define PetscBTLookup(array,index) (_BT_idx = (index)/PETSC_BITS_PER_BYTE,
83: _BT_c = array[_BT_idx],
84: _BT_mask = (char)1 << ((index)%PETSC_BITS_PER_BYTE),
85: (_BT_c & _BT_mask) != 0)
87: #endif