Actual source code: petscbt.h
1: #pragma once
3: #include <petscsystypes.h>
4: #include <petscviewertypes.h>
5: #include <petscstring.h>
7: /* SUBMANSEC = Sys */
9: /* convert an index i to an index suitable for indexing a PetscBT, such that
10: * bt[PetscBTIndex(i)] returns the i'th value of the bt */
11: static inline size_t PetscBTIndex_Internal(PetscCount index)
12: {
13: return (size_t)index / PETSC_BITS_PER_BYTE;
14: }
16: static inline char PetscBTMask_Internal(PetscCount index)
17: {
18: return (char)(1 << index % PETSC_BITS_PER_BYTE);
19: }
21: static inline size_t PetscBTLength(PetscCount m)
22: {
23: return (size_t)m / PETSC_BITS_PER_BYTE + 1;
24: }
26: static inline PetscErrorCode PetscBTMemzero(PetscCount m, PetscBT array)
27: {
28: return PetscArrayzero(array, PetscBTLength(m));
29: }
31: static inline PetscErrorCode PetscBTDestroy(PetscBT *array)
32: {
33: return (*array) ? PetscFree(*array) : PETSC_SUCCESS;
34: }
36: static inline PetscErrorCode PetscBTCreate(PetscCount m, PetscBT *array)
37: {
38: return PetscCalloc1(PetscBTLength(m), array);
39: }
41: static inline PetscErrorCode PetscBTCopy(PetscBT dest, PetscCount m, PetscBT source)
42: {
43: return PetscArraycpy(dest, source, PetscBTLength(m));
44: }
46: static inline char PetscBTLookup(PetscBT array, PetscCount index)
47: {
48: return array[PetscBTIndex_Internal(index)] & PetscBTMask_Internal(index);
49: }
51: static inline PetscErrorCode PetscBTSet(PetscBT array, PetscCount index)
52: {
53: PetscFunctionBegin;
54: array[PetscBTIndex_Internal(index)] |= PetscBTMask_Internal(index);
55: PetscFunctionReturn(PETSC_SUCCESS);
56: }
58: static inline PetscErrorCode PetscBTNegate(PetscBT array, PetscCount index)
59: {
60: PetscFunctionBegin;
61: array[PetscBTIndex_Internal(index)] ^= PetscBTMask_Internal(index);
62: PetscFunctionReturn(PETSC_SUCCESS);
63: }
65: static inline PetscErrorCode PetscBTClear(PetscBT array, PetscCount index)
66: {
67: PetscFunctionBegin;
68: array[PetscBTIndex_Internal(index)] &= (char)~PetscBTMask_Internal(index);
69: PetscFunctionReturn(PETSC_SUCCESS);
70: }
72: static inline char PetscBTLookupSet(PetscBT array, PetscCount index)
73: {
74: const char ret = PetscBTLookup(array, index);
75: PetscCallContinue(PetscBTSet(array, index));
76: return ret;
77: }
79: static inline char PetscBTLookupClear(PetscBT array, PetscCount index)
80: {
81: const char ret = PetscBTLookup(array, index);
82: PetscCallContinue(PetscBTClear(array, index));
83: return ret;
84: }
86: PETSC_EXTERN PetscErrorCode PetscBTView(PetscCount, const PetscBT, PetscViewer);