Actual source code: petscfptimpl.h
petsc-3.12.1 2019-10-22
2: #if !defined(PETSCFPIMPL_H)
3: #define PETSCFPIMPL_H
4: #include <petscviewertypes.h>
5: #include <petscsys.h>
6: /*
7: Function pointer table that maps from function pointers to their string representation
10: */
11: typedef struct _n_PetscFPT* PetscFPT;
12: struct _n_PetscFPT {
13: void **functionpointer;
14: char **functionname;
15: PetscInt count;
16: PetscInt tablesize;
17: };
18: PETSC_INTERN PetscFPT PetscFPTData;
20: PETSC_STATIC_INLINE PetscErrorCode PetscFPTView(PetscViewer viewer)
21: {
22: PetscInt i;
24: if (!PetscFPTData) return(0);
25: for (i=0; i<PetscFPTData->tablesize; i++) {
26: if (PetscFPTData->functionpointer[i]) {
27: printf("%s()\n",PetscFPTData->functionname[i]);
28: }
29: }
30: return(0);
31: }
33: PETSC_STATIC_INLINE PetscErrorCode PetscFPTDestroy(void)
34: {
36: PetscFPT _PetscFPTData = PetscFPTData;
38: PetscFPTData = NULL;
39: if (!_PetscFPTData) return 0;
40: PetscFree((_PetscFPTData)->functionpointer);
41: PetscFree((_PetscFPTData)->functionname);
42: PetscFree(_PetscFPTData);
43: return(0);
44: }
46: /*
47: PetscFPTCreate Creates a PETSc look up table from function pointers to strings
49: Input Parameters:
50: . n - expected number of keys
52: */
53: PETSC_STATIC_INLINE PetscErrorCode PetscFPTCreate(PetscInt n)
54: {
56: PetscInt i;
57: PetscFPT _PetscFPTData;
59: if (n < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"n < 0");
60: /* Cannot use PetscNew() here because it is not yet defined in the include file chain */
61: PetscMalloc(sizeof(struct _n_PetscFPT),&_PetscFPTData);
62: _PetscFPTData->tablesize = (3*n)/2 + 17;
63: if (_PetscFPTData->tablesize < n) _PetscFPTData->tablesize = PETSC_MAX_INT/4; /* overflow */
64: PetscMalloc(sizeof(void*)*_PetscFPTData->tablesize,&_PetscFPTData->functionpointer);
65: for (i=0; i<_PetscFPTData->tablesize; i++) {
66: _PetscFPTData->functionpointer[i] = NULL;
67: }
68: PetscMalloc(sizeof(char**)*_PetscFPTData->tablesize,&_PetscFPTData->functionname);
69: _PetscFPTData->count = 0;
70: PetscFPTData = _PetscFPTData;
71: return(0);
72: }
74: PETSC_STATIC_INLINE unsigned long PetscHashPointer(void *ptr)
75: {
76: #define PETSC_FPT_HASH_FACT 79943
77: return((PETSC_FPT_HASH_FACT*((size_t)ptr))%PetscFPTData->tablesize);
78: }
80: PETSC_STATIC_INLINE PetscErrorCode PetscFPTAdd(void* key,const char* data)
81: {
82: PetscInt i,hash;
84: if (!data) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Null function name");
85: if (!PetscFPTData) return(0);
86: hash = (PetscInt)PetscHashPointer(key);
87: for (i=0; i<PetscFPTData->tablesize; i++) {
88: if (PetscFPTData->functionpointer[hash] == key) {
89: PetscFPTData->functionname[hash] = (char*) data;
90: return(0);
91: } else if (!PetscFPTData->functionpointer[hash]) {
92: PetscFPTData->count++;
93: PetscFPTData->functionpointer[hash] = key;
94: PetscFPTData->functionname[hash] = (char*) data;
95: return(0);
96: }
97: hash = (hash == (PetscFPTData->tablesize-1)) ? 0 : hash+1;
98: }
99: SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Function pointer table is full");
100: return(0);
101: }
103: /*
104: PetscFPTFind - checks if a function pointer is in the table
106: If data==0, then no entry exists
108: */
109: PETSC_STATIC_INLINE PetscErrorCode PetscFPTFind(void* key,char const **data)
110: {
111: PetscInt hash,ii = 0;
113: *data = 0;
114: if (!PetscFPTData) return(0);
115: hash = PetscHashPointer(key);
116: while (ii++ < PetscFPTData->tablesize) {
117: if (!PetscFPTData->functionpointer[hash]) break;
118: else if (PetscFPTData->functionpointer[hash] == key) {
119: *data = PetscFPTData->functionname[hash];
120: break;
121: }
122: hash = (hash == (PetscFPTData->tablesize-1)) ? 0 : hash+1;
123: }
124: return(0);
125: }
127: #endif