1 static char help[] = "Test PETSc integer hash map.\n\n"; 2 3 #include <petsc/private/hashmapi.h> 4 #include <petsc/private/hashmapiv.h> 5 #include <petscsys.h> 6 7 /* Unused, keep it for testing purposes */ 8 PETSC_HASH_MAP(HMapIP, PetscInt, void*, PetscHashInt, PetscHashEqual, NULL) 9 10 /* Unused, keep it for testing purposes */ 11 typedef struct { double x; double y; double z; } Point; 12 static Point origin = {0.0, 0.0, 0.0}; 13 PETSC_HASH_MAP(HMapIS, PetscInt, Point, PetscHashInt, PetscHashEqual, origin) 14 15 #define PetscTestCheck(expr) PetscCheck(expr,PETSC_COMM_SELF,PETSC_ERR_LIB, "Assertion: `%s' failed.", PetscStringize(expr)) 16 17 int main(int argc,char **argv) 18 { 19 PetscHMapI ht = NULL, hd; 20 PetscHMapIV htv; 21 PetscInt n, v, koff, keys[4], voff, vals[4],na,nb,i,size,*karray,off; 22 PetscScalar *varray,*vwork; 23 PetscBool has, flag; 24 25 PetscCall(PetscInitialize(&argc,&argv,NULL,help)); 26 27 PetscCall(PetscHMapICreate(&ht)); 28 PetscTestCheck(ht != NULL); 29 PetscCall(PetscHMapIGetSize(ht,&n)); 30 PetscTestCheck(n == 0); 31 32 PetscCall(PetscHMapIResize(ht,0)); 33 PetscCall(PetscHMapIGetSize(ht,&n)); 34 PetscTestCheck(n == 0); 35 36 PetscCall(PetscHMapIHas(ht,123,&has)); 37 PetscTestCheck(has == PETSC_FALSE); 38 PetscCall(PetscHMapIGet(ht,123,&v)); 39 PetscTestCheck(v == -1); 40 41 PetscCall(PetscHMapISet(ht,123,42)); 42 PetscCall(PetscHMapIGetSize(ht,&n)); 43 PetscTestCheck(n == 1); 44 PetscCall(PetscHMapIHas(ht,123,&has)); 45 PetscTestCheck(has == PETSC_TRUE); 46 PetscCall(PetscHMapIGet(ht,123,&v)); 47 PetscTestCheck(v == 42); 48 49 PetscCall(PetscHMapIDel(ht,123)); 50 PetscCall(PetscHMapIGetSize(ht,&n)); 51 PetscTestCheck(n == 0); 52 PetscCall(PetscHMapIHas(ht,123,&has)); 53 PetscTestCheck(has == PETSC_FALSE); 54 PetscCall(PetscHMapIGet(ht,123,&v)); 55 PetscTestCheck(v == -1); 56 57 PetscCall(PetscHMapIQuerySet(ht,123,1,&flag)); 58 PetscTestCheck(flag == PETSC_TRUE); 59 PetscCall(PetscHMapIQuerySet(ht,123,1,&flag)); 60 PetscTestCheck(flag == PETSC_FALSE); 61 PetscCall(PetscHMapIQueryDel(ht,123,&flag)); 62 PetscTestCheck(flag == PETSC_TRUE); 63 PetscCall(PetscHMapIQueryDel(ht,123,&flag)); 64 PetscTestCheck(flag == PETSC_FALSE); 65 66 PetscCall(PetscHMapIResize(ht,13)); 67 PetscCall(PetscHMapIGetSize(ht,&n)); 68 PetscTestCheck(n == 0); 69 70 PetscCall(PetscHMapIClear(ht)); 71 PetscCall(PetscHMapIGetSize(ht,&n)); 72 PetscTestCheck(n == 0); 73 74 PetscCall(PetscHMapISet(ht,321,24)); 75 PetscCall(PetscHMapISet(ht,123,42)); 76 PetscCall(PetscHMapIGetSize(ht,&n)); 77 PetscTestCheck(n == 2); 78 79 koff = 0; keys[0] = keys[1] = 0; 80 PetscCall(PetscHMapIGetKeys(ht,&koff,keys)); 81 PetscCall(PetscSortInt(koff,keys)); 82 PetscTestCheck(koff == 2); 83 PetscTestCheck(keys[0] == 123); 84 PetscTestCheck(keys[1] == 321); 85 86 voff = 0; vals[0] = vals[1] = 0; 87 PetscCall(PetscHMapIGetVals(ht,&voff,vals)); 88 PetscCall(PetscSortInt(voff,vals)); 89 PetscTestCheck(voff == 2); 90 PetscTestCheck(vals[0] == 24); 91 PetscTestCheck(vals[1] == 42); 92 93 koff = 0; keys[0] = keys[1] = 0; 94 voff = 0; vals[0] = vals[1] = 0; 95 PetscCall(PetscHMapIDuplicate(ht,&hd)); 96 PetscCall(PetscHMapIGetKeys(ht,&koff,keys)); 97 PetscCall(PetscHMapIGetVals(ht,&voff,vals)); 98 PetscCall(PetscSortInt(koff,keys)); 99 PetscCall(PetscSortInt(voff,vals)); 100 PetscTestCheck(koff == 2); 101 PetscTestCheck(voff == 2); 102 PetscTestCheck(keys[0] == 123); 103 PetscTestCheck(keys[1] == 321); 104 PetscTestCheck(vals[0] == 24); 105 PetscTestCheck(vals[1] == 42); 106 PetscCall(PetscHMapIDestroy(&hd)); 107 108 PetscCall(PetscHMapISet(ht,0,0)); 109 PetscCall(PetscHMapIGetSize(ht,&n)); 110 PetscTestCheck(n != 0); 111 PetscCall(PetscHMapIReset(ht)); 112 PetscCall(PetscHMapIGetSize(ht,&n)); 113 PetscTestCheck(n == 0); 114 PetscCall(PetscHMapIReset(ht)); 115 PetscCall(PetscHMapIGetSize(ht,&n)); 116 PetscTestCheck(n == 0); 117 PetscCall(PetscHMapISet(ht,0,0)); 118 PetscCall(PetscHMapIGetSize(ht,&n)); 119 PetscTestCheck(n != 0); 120 121 PetscCall(PetscHMapIDestroy(&ht)); 122 PetscTestCheck(ht == NULL); 123 124 PetscCall(PetscHMapICreate(&ht)); 125 PetscCall(PetscHMapIReset(ht)); 126 PetscCall(PetscHMapIGetSize(ht,&n)); 127 PetscTestCheck(n == 0); 128 PetscCall(PetscHMapIDestroy(&ht)); 129 130 PetscCall(PetscHMapIVCreate(&htv)); 131 n = 10; 132 PetscCall(PetscHMapIVResize(htv,n)); 133 PetscCall(PetscHMapIVGetCapacity(htv,&na)); 134 PetscTestCheck(na>=n); 135 for (i=0; i<n; i++) PetscCall(PetscHMapIVSet(htv,i+100,10.)); 136 137 PetscCall(PetscHMapIVGetCapacity(htv,&nb)); 138 PetscTestCheck(nb>=na); 139 for (i=0; i<(2*n); i++) PetscCall(PetscHMapIVAddValue(htv,i+100,5.)); 140 141 PetscCall(PetscHMapIVGetSize(htv,&size)); 142 PetscTestCheck(size==(2*n)); 143 PetscCall(PetscMalloc3(size,&karray,size,&varray,size,&vwork)); 144 off = 0; 145 PetscCall(PetscHMapIVGetPairs(htv,&off,karray,varray)); 146 PetscTestCheck(off==(2*n)); 147 PetscCall(PetscSortIntWithDataArray(off,karray,varray,sizeof(PetscScalar),vwork)); 148 for (i=0; i<n; i++) { 149 PetscTestCheck(karray[i]==(i+100)); 150 PetscTestCheck(karray[n+i]==(n+i+100)); 151 PetscTestCheck(varray[i]==15.); 152 PetscTestCheck(varray[n+i]==5.); 153 } 154 PetscCall(PetscFree3(karray,varray,vwork)); 155 PetscCall(PetscHMapIVDestroy(&htv)); 156 157 PetscCall(PetscFinalize()); 158 return 0; 159 } 160 161 /*TEST 162 163 test: 164 165 TEST*/ 166