Actual source code: petscfptimpl.h
petsc-3.7.6 2017-04-24
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: extern PetscFPT PetscFPTData;
22: PETSC_STATIC_INLINE PetscErrorCode PetscFPTView(PetscViewer viewer)
23: {
24: PetscInt i;
26: if (!PetscFPTData) return(0);
27: for (i=0; i<PetscFPTData->tablesize; i++) {
28: if (PetscFPTData->functionpointer[i]) {
29: printf("%s()\n",PetscFPTData->functionname[i]);
30: }
31: }
32: return(0);
33: }
36: PETSC_STATIC_INLINE PetscErrorCode PetscFPTDestroy(void)
37: {
39: PetscFPT _PetscFPTData = PetscFPTData;
41: PetscFPTData = NULL;
42: if (!_PetscFPTData) return 0;
43: PetscFree((_PetscFPTData)->functionpointer);
44: PetscFree((_PetscFPTData)->functionname);
45: PetscFree(_PetscFPTData);
46: return(0);
47: }
51: /*
52: PetscFPTCreate Creates a PETSc look up table from function pointers to strings
54: Input Parameters:
55: . n - expected number of keys
57: */
58: PETSC_STATIC_INLINE PetscErrorCode PetscFPTCreate(PetscInt n)
59: {
61: PetscInt i;
62: PetscFPT _PetscFPTData;
64: if (n < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"n < 0");
65: PetscMalloc(sizeof(struct _n_PetscFPT),&_PetscFPTData);
66: _PetscFPTData->tablesize = (3*n)/2 + 17;
67: if (_PetscFPTData->tablesize < n) _PetscFPTData->tablesize = PETSC_MAX_INT/4; /* overflow */
68: PetscMalloc(sizeof(void*)*_PetscFPTData->tablesize,&_PetscFPTData->functionpointer);
69: for (i=0; i<_PetscFPTData->tablesize; i++) {
70: _PetscFPTData->functionpointer[i] = NULL;
71: }
72: PetscMalloc(sizeof(char**)*_PetscFPTData->tablesize,&_PetscFPTData->functionname);
73: _PetscFPTData->count = 0;
74: PetscFPTData = _PetscFPTData;
75: return(0);
76: }
80: PETSC_STATIC_INLINE unsigned long PetscHashPointer(void *ptr)
81: {
82: #define PETSC_FPT_HASH_FACT 79943
83: return((PETSC_FPT_HASH_FACT*((size_t)ptr))%PetscFPTData->tablesize);
84: }
88: PETSC_STATIC_INLINE PetscErrorCode PetscFPTAdd(void* key,const char* data)
89: {
90: PetscInt i,hash;
92: if (!data) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Null function name");
93: if (!PetscFPTData) return(0);
94: hash = (PetscInt)PetscHashPointer(key);
95: for (i=0; i<PetscFPTData->tablesize; i++) {
96: if (PetscFPTData->functionpointer[hash] == key) {
97: PetscFPTData->functionname[hash] = (char*) data;
98: return(0);
99: } else if (!PetscFPTData->functionpointer[hash]) {
100: PetscFPTData->count++;
101: PetscFPTData->functionpointer[hash] = key;
102: PetscFPTData->functionname[hash] = (char*) data;
103: return(0);
104: }
105: hash = (hash == (PetscFPTData->tablesize-1)) ? 0 : hash+1;
106: }
107: SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Function pointer table is full");
108: return(0);
109: }
113: /*
114: PetscFPTFind - checks if a function pointer is in the table
116: If data==0, then no entry exists
118: */
119: PETSC_STATIC_INLINE PetscErrorCode PetscFPTFind(void* key,char const **data)
120: {
121: PetscInt hash,ii = 0;
123: *data = 0;
124: if (!PetscFPTData) return(0);
125: hash = PetscHashPointer(key);
126: while (ii++ < PetscFPTData->tablesize) {
127: if (!PetscFPTData->functionpointer[hash]) break;
128: else if (PetscFPTData->functionpointer[hash] == key) {
129: *data = PetscFPTData->functionname[hash];
130: break;
131: }
132: hash = (hash == (PetscFPTData->tablesize-1)) ? 0 : hash+1;
133: }
134: return(0);
135: }
137: #endif