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 PetscErrorCode ierr; 25 26 ierr = PetscInitialize(&argc,&argv,NULL,help);if (ierr) return ierr; 27 28 CHKERRQ(PetscHMapICreate(&ht)); 29 PetscTestCheck(ht != NULL); 30 CHKERRQ(PetscHMapIGetSize(ht,&n)); 31 PetscTestCheck(n == 0); 32 33 CHKERRQ(PetscHMapIResize(ht,0)); 34 CHKERRQ(PetscHMapIGetSize(ht,&n)); 35 PetscTestCheck(n == 0); 36 37 CHKERRQ(PetscHMapIHas(ht,123,&has)); 38 PetscTestCheck(has == PETSC_FALSE); 39 CHKERRQ(PetscHMapIGet(ht,123,&v)); 40 PetscTestCheck(v == -1); 41 42 CHKERRQ(PetscHMapISet(ht,123,42)); 43 CHKERRQ(PetscHMapIGetSize(ht,&n)); 44 PetscTestCheck(n == 1); 45 CHKERRQ(PetscHMapIHas(ht,123,&has)); 46 PetscTestCheck(has == PETSC_TRUE); 47 CHKERRQ(PetscHMapIGet(ht,123,&v)); 48 PetscTestCheck(v == 42); 49 50 CHKERRQ(PetscHMapIDel(ht,123)); 51 CHKERRQ(PetscHMapIGetSize(ht,&n)); 52 PetscTestCheck(n == 0); 53 CHKERRQ(PetscHMapIHas(ht,123,&has)); 54 PetscTestCheck(has == PETSC_FALSE); 55 CHKERRQ(PetscHMapIGet(ht,123,&v)); 56 PetscTestCheck(v == -1); 57 58 CHKERRQ(PetscHMapIQuerySet(ht,123,1,&flag)); 59 PetscTestCheck(flag == PETSC_TRUE); 60 CHKERRQ(PetscHMapIQuerySet(ht,123,1,&flag)); 61 PetscTestCheck(flag == PETSC_FALSE); 62 CHKERRQ(PetscHMapIQueryDel(ht,123,&flag)); 63 PetscTestCheck(flag == PETSC_TRUE); 64 CHKERRQ(PetscHMapIQueryDel(ht,123,&flag)); 65 PetscTestCheck(flag == PETSC_FALSE); 66 67 CHKERRQ(PetscHMapIResize(ht,13)); 68 CHKERRQ(PetscHMapIGetSize(ht,&n)); 69 PetscTestCheck(n == 0); 70 71 CHKERRQ(PetscHMapIClear(ht)); 72 CHKERRQ(PetscHMapIGetSize(ht,&n)); 73 PetscTestCheck(n == 0); 74 75 CHKERRQ(PetscHMapISet(ht,321,24)); 76 CHKERRQ(PetscHMapISet(ht,123,42)); 77 CHKERRQ(PetscHMapIGetSize(ht,&n)); 78 PetscTestCheck(n == 2); 79 80 koff = 0; keys[0] = keys[1] = 0; 81 CHKERRQ(PetscHMapIGetKeys(ht,&koff,keys)); 82 CHKERRQ(PetscSortInt(koff,keys)); 83 PetscTestCheck(koff == 2); 84 PetscTestCheck(keys[0] == 123); 85 PetscTestCheck(keys[1] == 321); 86 87 voff = 0; vals[0] = vals[1] = 0; 88 CHKERRQ(PetscHMapIGetVals(ht,&voff,vals)); 89 CHKERRQ(PetscSortInt(voff,vals)); 90 PetscTestCheck(voff == 2); 91 PetscTestCheck(vals[0] == 24); 92 PetscTestCheck(vals[1] == 42); 93 94 koff = 0; keys[0] = keys[1] = 0; 95 voff = 0; vals[0] = vals[1] = 0; 96 CHKERRQ(PetscHMapIDuplicate(ht,&hd)); 97 CHKERRQ(PetscHMapIGetKeys(ht,&koff,keys)); 98 CHKERRQ(PetscHMapIGetVals(ht,&voff,vals)); 99 CHKERRQ(PetscSortInt(koff,keys)); 100 CHKERRQ(PetscSortInt(voff,vals)); 101 PetscTestCheck(koff == 2); 102 PetscTestCheck(voff == 2); 103 PetscTestCheck(keys[0] == 123); 104 PetscTestCheck(keys[1] == 321); 105 PetscTestCheck(vals[0] == 24); 106 PetscTestCheck(vals[1] == 42); 107 CHKERRQ(PetscHMapIDestroy(&hd)); 108 109 CHKERRQ(PetscHMapISet(ht,0,0)); 110 CHKERRQ(PetscHMapIGetSize(ht,&n)); 111 PetscTestCheck(n != 0); 112 CHKERRQ(PetscHMapIReset(ht)); 113 CHKERRQ(PetscHMapIGetSize(ht,&n)); 114 PetscTestCheck(n == 0); 115 CHKERRQ(PetscHMapIReset(ht)); 116 CHKERRQ(PetscHMapIGetSize(ht,&n)); 117 PetscTestCheck(n == 0); 118 CHKERRQ(PetscHMapISet(ht,0,0)); 119 CHKERRQ(PetscHMapIGetSize(ht,&n)); 120 PetscTestCheck(n != 0); 121 122 CHKERRQ(PetscHMapIDestroy(&ht)); 123 PetscTestCheck(ht == NULL); 124 125 CHKERRQ(PetscHMapICreate(&ht)); 126 CHKERRQ(PetscHMapIReset(ht)); 127 CHKERRQ(PetscHMapIGetSize(ht,&n)); 128 PetscTestCheck(n == 0); 129 CHKERRQ(PetscHMapIDestroy(&ht)); 130 131 CHKERRQ(PetscHMapIVCreate(&htv)); 132 n = 10; 133 CHKERRQ(PetscHMapIVResize(htv,n)); 134 CHKERRQ(PetscHMapIVGetCapacity(htv,&na)); 135 PetscTestCheck(na>=n); 136 for (i=0; i<n; i++) CHKERRQ(PetscHMapIVSet(htv,i+100,10.)); 137 138 CHKERRQ(PetscHMapIVGetCapacity(htv,&nb)); 139 PetscTestCheck(nb>=na); 140 for (i=0; i<(2*n); i++) CHKERRQ(PetscHMapIVAddValue(htv,i+100,5.)); 141 142 CHKERRQ(PetscHMapIVGetSize(htv,&size)); 143 PetscTestCheck(size==(2*n)); 144 CHKERRQ(PetscMalloc3(size,&karray,size,&varray,size,&vwork)); 145 off = 0; 146 CHKERRQ(PetscHMapIVGetPairs(htv,&off,karray,varray)); 147 PetscTestCheck(off==(2*n)); 148 CHKERRQ(PetscSortIntWithDataArray(off,karray,varray,sizeof(PetscScalar),vwork)); 149 for (i=0; i<n; i++) { 150 PetscTestCheck(karray[i]==(i+100)); 151 PetscTestCheck(karray[n+i]==(n+i+100)); 152 PetscTestCheck(varray[i]==15.); 153 PetscTestCheck(varray[n+i]==5.); 154 } 155 CHKERRQ(PetscFree3(karray,varray,vwork)); 156 CHKERRQ(PetscHMapIVDestroy(&htv)); 157 158 ierr = PetscFinalize(); 159 return ierr; 160 } 161 162 /*TEST 163 164 test: 165 166 TEST*/ 167