/usr/lib/petscdir/3.4.2/include/petscctable.h is in libpetsc3.4.2-dev 3.4.2.dfsg1-6.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | #ifndef __PETSCCTABLE_H
#define __PETSCCTABLE_H
#include <petscsys.h>
struct _n_PetscTable {
PetscInt *keytable;
PetscInt *table;
PetscInt count;
PetscInt tablesize;
PetscInt head;
PetscInt maxkey; /* largest key allowed */
};
typedef struct _n_PetscTable* PetscTable;
typedef PetscInt* PetscTablePosition;
#undef __FUNCT__
#define __FUNCT__ "PetscHash"
PETSC_STATIC_INLINE unsigned long PetscHash(PetscTable ta,unsigned long x)
{
#define PETSC_HASH_FACT 79943
PetscFunctionBegin;
PetscFunctionReturn((PETSC_HASH_FACT*x)%ta->tablesize);
}
PETSC_EXTERN PetscErrorCode PetscTableCreate(const PetscInt,PetscInt,PetscTable*);
PETSC_EXTERN PetscErrorCode PetscTableCreateCopy(const PetscTable,PetscTable*);
PETSC_EXTERN PetscErrorCode PetscTableDestroy(PetscTable*);
PETSC_EXTERN PetscErrorCode PetscTableGetCount(const PetscTable,PetscInt*);
PETSC_EXTERN PetscErrorCode PetscTableIsEmpty(const PetscTable,PetscInt*);
PETSC_EXTERN PetscErrorCode PetscTableAddExpand(PetscTable,PetscInt,PetscInt,InsertMode);
PETSC_EXTERN PetscErrorCode PetscTableAddCountExpand(PetscTable,PetscInt);
PETSC_EXTERN PetscErrorCode PetscTableGetHeadPosition(PetscTable,PetscTablePosition*);
PETSC_EXTERN PetscErrorCode PetscTableGetNext(PetscTable,PetscTablePosition*,PetscInt*,PetscInt*);
PETSC_EXTERN PetscErrorCode PetscTableRemoveAll(PetscTable);
#undef __FUNCT__
#define __FUNCT__ "PetscTableAdd"
PETSC_STATIC_INLINE PetscErrorCode PetscTableAdd(PetscTable ta,PetscInt key,PetscInt data,InsertMode imode)
{
PetscErrorCode ierr;
PetscInt i,hash = (PetscInt)PetscHash(ta,key);
PetscFunctionBegin;
if (key <= 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"key <= 0");
if (key > ta->maxkey) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"key %D is greater than largest key allowed %D",key,ta->maxkey);
if (!data) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Null data");
for (i=0; i<ta->tablesize; i++) {
if (ta->keytable[hash] == key) {
switch (imode) {
case INSERT_VALUES:
ta->table[hash] = data; /* over write */
break;
case ADD_VALUES:
ta->table[hash] += data;
break;
case MAX_VALUES:
ta->table[hash] = PetscMax(ta->table[hash],data);
break;
default: SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Unsupported InsertMode");
}
PetscFunctionReturn(0);
} else if (!ta->keytable[hash]) {
if (ta->count < 5*(ta->tablesize/6) - 1) {
ta->count++; /* add */
ta->keytable[hash] = key;
ta->table[hash] = data;
} else {
ierr = PetscTableAddExpand(ta,key,data,imode);CHKERRQ(ierr);
}
PetscFunctionReturn(0);
}
hash = (hash == (ta->tablesize-1)) ? 0 : hash+1;
}
SETERRQ(PETSC_COMM_SELF,PETSC_ERR_COR,"Full table");
/* PetscFunctionReturn(0); */
}
#undef __FUNCT__
#define __FUNCT__ "PetscTableAddCount"
PETSC_STATIC_INLINE PetscErrorCode PetscTableAddCount(PetscTable ta,PetscInt key)
{
PetscErrorCode ierr;
PetscInt i,hash = (PetscInt)PetscHash(ta,key);
PetscFunctionBegin;
if (key <= 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"key <= 0");
if (key > ta->maxkey) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"key %D is greater than largest key allowed %D",key,ta->maxkey);
for (i=0; i<ta->tablesize; i++) {
if (ta->keytable[hash] == key) {
PetscFunctionReturn(0);
} else if (!ta->keytable[hash]) {
if (ta->count < 5*(ta->tablesize/6) - 1) {
ta->count++; /* add */
ta->keytable[hash] = key;
ta->table[hash] = ta->count;
} else {
ierr = PetscTableAddCountExpand(ta,key);CHKERRQ(ierr);
}
PetscFunctionReturn(0);
}
hash = (hash == (ta->tablesize-1)) ? 0 : hash+1;
}
SETERRQ(PETSC_COMM_SELF,PETSC_ERR_COR,"Full table");
/* PetscFunctionReturn(0); */
}
#undef __FUNCT__
#define __FUNCT__ "PetscTableFind"
/*
PetscTableFind - checks if a key is in the table
If data==0, then no table entry exists.
*/
PETSC_STATIC_INLINE PetscErrorCode PetscTableFind(PetscTable ta,PetscInt key,PetscInt *data)
{
PetscInt hash,ii = 0;
PetscFunctionBegin;
*data = 0;
if (key <= 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Key <= 0");
if (key > ta->maxkey) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"key %D is greater than largest key allowed %D",key,ta->maxkey);
hash = (PetscInt)PetscHash(ta,key);
while (ii++ < ta->tablesize) {
if (!ta->keytable[hash]) break;
else if (ta->keytable[hash] == key) {
*data = ta->table[hash];
break;
}
hash = (hash == (ta->tablesize-1)) ? 0 : hash+1;
}
PetscFunctionReturn(0);
}
/* Reset __FUNCT__ in case the user does not define it themselves */
#undef __FUNCT__
#define __FUNCT__ "User provided function"
#endif
|