Actual source code: petscfptimpl.h
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: static inline PetscErrorCode PetscFPTView(PetscViewer viewer)
21: {
22: if (PetscFPTData) {
23: for (PetscInt i = 0; i < PetscFPTData->tablesize; ++i) {
24: if (PetscFPTData->functionpointer[i]) {
25: printf("%s()\n",PetscFPTData->functionname[i]);
26: }
27: }
28: }
29: return 0;
30: }
32: static inline PetscErrorCode PetscFPTDestroy(void)
33: {
34: PetscFPT data = PetscFPTData;
36: PetscFPTData = NULL;
37: if (!data) return 0;
38: PetscFree(data->functionpointer);
39: PetscFree(data->functionname);
40: PetscFree(data);
41: return 0;
42: }
44: /*
45: PetscFPTCreate Creates a PETSc look up table from function pointers to strings
47: Input Parameters:
48: . n - expected number of keys
50: */
51: static inline PetscErrorCode PetscFPTCreate(PetscInt n)
52: {
53: PetscFPT _PetscFPTData;
56: /* Cannot use PetscNew() here because it is not yet defined in the include file chain */
57: PetscMalloc(sizeof(struct _n_PetscFPT),&_PetscFPTData);
58: _PetscFPTData->tablesize = (3*n)/2 + 17;
59: if (_PetscFPTData->tablesize < n) _PetscFPTData->tablesize = PETSC_MAX_INT/4; /* overflow */
60: PetscCalloc(sizeof(void*)*_PetscFPTData->tablesize,&_PetscFPTData->functionpointer);
61: PetscMalloc(sizeof(char**)*_PetscFPTData->tablesize,&_PetscFPTData->functionname);
62: _PetscFPTData->count = 0;
63: PetscFPTData = _PetscFPTData;
64: return(0);
65: }
67: static inline unsigned long PetscFPTHashPointer(void *ptr)
68: {
69: #define PETSC_FPT_HASH_FACT 79943
70: return((PETSC_FPT_HASH_FACT*((size_t)ptr))%PetscFPTData->tablesize);
71: }
73: static inline PetscErrorCode PetscFPTAdd(void* key,const char* data)
74: {
76: if (!PetscFPTData) return 0;
77: for (PetscInt i = 0, hash = (PetscInt)PetscFPTHashPointer(key); i < PetscFPTData->tablesize; ++i) {
78: if (PetscFPTData->functionpointer[hash] == key) {
79: PetscFPTData->functionname[hash] = (char*) data;
80: return 0;
81: } else if (!PetscFPTData->functionpointer[hash]) {
82: PetscFPTData->count++;
83: PetscFPTData->functionpointer[hash] = key;
84: PetscFPTData->functionname[hash] = (char*) data;
85: return 0;
86: }
87: hash = (hash == (PetscFPTData->tablesize-1)) ? 0 : hash+1;
88: }
89: SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Function pointer table is full");
90: }
92: /*
93: PetscFPTFind - checks if a function pointer is in the table
95: If data==0, then no entry exists
97: */
98: static inline PetscErrorCode PetscFPTFind(void* key,char const **data)
99: {
100: PetscInt hash,ii = 0;
102: *data = NULL;
103: if (!PetscFPTData) return(0);
104: hash = PetscFPTHashPointer(key);
105: while (ii++ < PetscFPTData->tablesize) {
106: if (!PetscFPTData->functionpointer[hash]) break;
107: else if (PetscFPTData->functionpointer[hash] == key) {
108: *data = PetscFPTData->functionname[hash];
109: break;
110: }
111: hash = (hash == (PetscFPTData->tablesize-1)) ? 0 : hash+1;
112: }
113: return 0;
114: }
116: #endif