1c4762a1bSJed Brown static char help[] = "Test PETSc integer hash map.\n\n"; 2c4762a1bSJed Brown 3c4762a1bSJed Brown #include <petsc/private/hashmapi.h> 4c4762a1bSJed Brown #include <petsc/private/hashmapiv.h> 5c4762a1bSJed Brown #include <petscsys.h> 6c4762a1bSJed Brown 7c4762a1bSJed Brown /* Unused, keep it for testing purposes */ 8c4762a1bSJed Brown PETSC_HASH_MAP(HMapIP, PetscInt, void *, PetscHashInt, PetscHashEqual, NULL) 9c4762a1bSJed Brown 10c4762a1bSJed Brown /* Unused, keep it for testing purposes */ 11*9371c9d4SSatish Balay typedef struct { 12*9371c9d4SSatish Balay double x; 13*9371c9d4SSatish Balay double y; 14*9371c9d4SSatish Balay double z; 15*9371c9d4SSatish Balay } Point; 16c4762a1bSJed Brown static Point origin = {0.0, 0.0, 0.0}; 17c4762a1bSJed Brown PETSC_HASH_MAP(HMapIS, PetscInt, Point, PetscHashInt, PetscHashEqual, origin) 18c4762a1bSJed Brown 195f80ce2aSJacob Faibussowitsch #define PetscTestCheck(expr) PetscCheck(expr, PETSC_COMM_SELF, PETSC_ERR_LIB, "Assertion: `%s' failed.", PetscStringize(expr)) 20c4762a1bSJed Brown 21*9371c9d4SSatish Balay int main(int argc, char **argv) { 22c4762a1bSJed Brown PetscHMapI ht = NULL, hd; 23c4762a1bSJed Brown PetscHMapIV htv; 24c4762a1bSJed Brown PetscInt n, v, koff, keys[4], voff, vals[4], na, nb, i, size, *karray, off; 25c4762a1bSJed Brown PetscScalar *varray, *vwork; 26c4762a1bSJed Brown PetscBool has, flag; 27c4762a1bSJed Brown 28327415f7SBarry Smith PetscFunctionBeginUser; 299566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 30c4762a1bSJed Brown 319566063dSJacob Faibussowitsch PetscCall(PetscHMapICreate(&ht)); 322c71b3e2SJacob Faibussowitsch PetscTestCheck(ht != NULL); 339566063dSJacob Faibussowitsch PetscCall(PetscHMapIGetSize(ht, &n)); 342c71b3e2SJacob Faibussowitsch PetscTestCheck(n == 0); 35c4762a1bSJed Brown 369566063dSJacob Faibussowitsch PetscCall(PetscHMapIResize(ht, 0)); 379566063dSJacob Faibussowitsch PetscCall(PetscHMapIGetSize(ht, &n)); 382c71b3e2SJacob Faibussowitsch PetscTestCheck(n == 0); 39c4762a1bSJed Brown 409566063dSJacob Faibussowitsch PetscCall(PetscHMapIHas(ht, 123, &has)); 412c71b3e2SJacob Faibussowitsch PetscTestCheck(has == PETSC_FALSE); 429566063dSJacob Faibussowitsch PetscCall(PetscHMapIGet(ht, 123, &v)); 432c71b3e2SJacob Faibussowitsch PetscTestCheck(v == -1); 44c4762a1bSJed Brown 459566063dSJacob Faibussowitsch PetscCall(PetscHMapISet(ht, 123, 42)); 469566063dSJacob Faibussowitsch PetscCall(PetscHMapIGetSize(ht, &n)); 472c71b3e2SJacob Faibussowitsch PetscTestCheck(n == 1); 489566063dSJacob Faibussowitsch PetscCall(PetscHMapIHas(ht, 123, &has)); 492c71b3e2SJacob Faibussowitsch PetscTestCheck(has == PETSC_TRUE); 509566063dSJacob Faibussowitsch PetscCall(PetscHMapIGet(ht, 123, &v)); 512c71b3e2SJacob Faibussowitsch PetscTestCheck(v == 42); 52c4762a1bSJed Brown 539566063dSJacob Faibussowitsch PetscCall(PetscHMapIDel(ht, 123)); 549566063dSJacob Faibussowitsch PetscCall(PetscHMapIGetSize(ht, &n)); 552c71b3e2SJacob Faibussowitsch PetscTestCheck(n == 0); 569566063dSJacob Faibussowitsch PetscCall(PetscHMapIHas(ht, 123, &has)); 572c71b3e2SJacob Faibussowitsch PetscTestCheck(has == PETSC_FALSE); 589566063dSJacob Faibussowitsch PetscCall(PetscHMapIGet(ht, 123, &v)); 592c71b3e2SJacob Faibussowitsch PetscTestCheck(v == -1); 60c4762a1bSJed Brown 619566063dSJacob Faibussowitsch PetscCall(PetscHMapIQuerySet(ht, 123, 1, &flag)); 622c71b3e2SJacob Faibussowitsch PetscTestCheck(flag == PETSC_TRUE); 639566063dSJacob Faibussowitsch PetscCall(PetscHMapIQuerySet(ht, 123, 1, &flag)); 642c71b3e2SJacob Faibussowitsch PetscTestCheck(flag == PETSC_FALSE); 659566063dSJacob Faibussowitsch PetscCall(PetscHMapIQueryDel(ht, 123, &flag)); 662c71b3e2SJacob Faibussowitsch PetscTestCheck(flag == PETSC_TRUE); 679566063dSJacob Faibussowitsch PetscCall(PetscHMapIQueryDel(ht, 123, &flag)); 682c71b3e2SJacob Faibussowitsch PetscTestCheck(flag == PETSC_FALSE); 69c4762a1bSJed Brown 709566063dSJacob Faibussowitsch PetscCall(PetscHMapIResize(ht, 13)); 719566063dSJacob Faibussowitsch PetscCall(PetscHMapIGetSize(ht, &n)); 722c71b3e2SJacob Faibussowitsch PetscTestCheck(n == 0); 73c4762a1bSJed Brown 749566063dSJacob Faibussowitsch PetscCall(PetscHMapIClear(ht)); 759566063dSJacob Faibussowitsch PetscCall(PetscHMapIGetSize(ht, &n)); 762c71b3e2SJacob Faibussowitsch PetscTestCheck(n == 0); 77c4762a1bSJed Brown 789566063dSJacob Faibussowitsch PetscCall(PetscHMapISet(ht, 321, 24)); 799566063dSJacob Faibussowitsch PetscCall(PetscHMapISet(ht, 123, 42)); 809566063dSJacob Faibussowitsch PetscCall(PetscHMapIGetSize(ht, &n)); 812c71b3e2SJacob Faibussowitsch PetscTestCheck(n == 2); 82c4762a1bSJed Brown 83*9371c9d4SSatish Balay koff = 0; 84*9371c9d4SSatish Balay keys[0] = keys[1] = 0; 859566063dSJacob Faibussowitsch PetscCall(PetscHMapIGetKeys(ht, &koff, keys)); 869566063dSJacob Faibussowitsch PetscCall(PetscSortInt(koff, keys)); 872c71b3e2SJacob Faibussowitsch PetscTestCheck(koff == 2); 882c71b3e2SJacob Faibussowitsch PetscTestCheck(keys[0] == 123); 892c71b3e2SJacob Faibussowitsch PetscTestCheck(keys[1] == 321); 90c4762a1bSJed Brown 91*9371c9d4SSatish Balay voff = 0; 92*9371c9d4SSatish Balay vals[0] = vals[1] = 0; 939566063dSJacob Faibussowitsch PetscCall(PetscHMapIGetVals(ht, &voff, vals)); 949566063dSJacob Faibussowitsch PetscCall(PetscSortInt(voff, vals)); 952c71b3e2SJacob Faibussowitsch PetscTestCheck(voff == 2); 962c71b3e2SJacob Faibussowitsch PetscTestCheck(vals[0] == 24); 972c71b3e2SJacob Faibussowitsch PetscTestCheck(vals[1] == 42); 98c4762a1bSJed Brown 99*9371c9d4SSatish Balay koff = 0; 100*9371c9d4SSatish Balay keys[0] = keys[1] = 0; 101*9371c9d4SSatish Balay voff = 0; 102*9371c9d4SSatish Balay vals[0] = vals[1] = 0; 1039566063dSJacob Faibussowitsch PetscCall(PetscHMapIDuplicate(ht, &hd)); 1049566063dSJacob Faibussowitsch PetscCall(PetscHMapIGetKeys(ht, &koff, keys)); 1059566063dSJacob Faibussowitsch PetscCall(PetscHMapIGetVals(ht, &voff, vals)); 1069566063dSJacob Faibussowitsch PetscCall(PetscSortInt(koff, keys)); 1079566063dSJacob Faibussowitsch PetscCall(PetscSortInt(voff, vals)); 1082c71b3e2SJacob Faibussowitsch PetscTestCheck(koff == 2); 1092c71b3e2SJacob Faibussowitsch PetscTestCheck(voff == 2); 1102c71b3e2SJacob Faibussowitsch PetscTestCheck(keys[0] == 123); 1112c71b3e2SJacob Faibussowitsch PetscTestCheck(keys[1] == 321); 1122c71b3e2SJacob Faibussowitsch PetscTestCheck(vals[0] == 24); 1132c71b3e2SJacob Faibussowitsch PetscTestCheck(vals[1] == 42); 1149566063dSJacob Faibussowitsch PetscCall(PetscHMapIDestroy(&hd)); 115c4762a1bSJed Brown 1169566063dSJacob Faibussowitsch PetscCall(PetscHMapISet(ht, 0, 0)); 1179566063dSJacob Faibussowitsch PetscCall(PetscHMapIGetSize(ht, &n)); 1182c71b3e2SJacob Faibussowitsch PetscTestCheck(n != 0); 1199566063dSJacob Faibussowitsch PetscCall(PetscHMapIReset(ht)); 1209566063dSJacob Faibussowitsch PetscCall(PetscHMapIGetSize(ht, &n)); 1212c71b3e2SJacob Faibussowitsch PetscTestCheck(n == 0); 1229566063dSJacob Faibussowitsch PetscCall(PetscHMapIReset(ht)); 1239566063dSJacob Faibussowitsch PetscCall(PetscHMapIGetSize(ht, &n)); 1242c71b3e2SJacob Faibussowitsch PetscTestCheck(n == 0); 1259566063dSJacob Faibussowitsch PetscCall(PetscHMapISet(ht, 0, 0)); 1269566063dSJacob Faibussowitsch PetscCall(PetscHMapIGetSize(ht, &n)); 1272c71b3e2SJacob Faibussowitsch PetscTestCheck(n != 0); 128c4762a1bSJed Brown 1299566063dSJacob Faibussowitsch PetscCall(PetscHMapIDestroy(&ht)); 1302c71b3e2SJacob Faibussowitsch PetscTestCheck(ht == NULL); 131c4762a1bSJed Brown 1329566063dSJacob Faibussowitsch PetscCall(PetscHMapICreate(&ht)); 1339566063dSJacob Faibussowitsch PetscCall(PetscHMapIReset(ht)); 1349566063dSJacob Faibussowitsch PetscCall(PetscHMapIGetSize(ht, &n)); 1352c71b3e2SJacob Faibussowitsch PetscTestCheck(n == 0); 1369566063dSJacob Faibussowitsch PetscCall(PetscHMapIDestroy(&ht)); 137c4762a1bSJed Brown 1389566063dSJacob Faibussowitsch PetscCall(PetscHMapIVCreate(&htv)); 139c4762a1bSJed Brown n = 10; 1409566063dSJacob Faibussowitsch PetscCall(PetscHMapIVResize(htv, n)); 1419566063dSJacob Faibussowitsch PetscCall(PetscHMapIVGetCapacity(htv, &na)); 1422c71b3e2SJacob Faibussowitsch PetscTestCheck(na >= n); 1439566063dSJacob Faibussowitsch for (i = 0; i < n; i++) PetscCall(PetscHMapIVSet(htv, i + 100, 10.)); 1445f80ce2aSJacob Faibussowitsch 1459566063dSJacob Faibussowitsch PetscCall(PetscHMapIVGetCapacity(htv, &nb)); 1462c71b3e2SJacob Faibussowitsch PetscTestCheck(nb >= na); 1479566063dSJacob Faibussowitsch for (i = 0; i < (2 * n); i++) PetscCall(PetscHMapIVAddValue(htv, i + 100, 5.)); 1485f80ce2aSJacob Faibussowitsch 1499566063dSJacob Faibussowitsch PetscCall(PetscHMapIVGetSize(htv, &size)); 1502c71b3e2SJacob Faibussowitsch PetscTestCheck(size == (2 * n)); 1519566063dSJacob Faibussowitsch PetscCall(PetscMalloc3(size, &karray, size, &varray, size, &vwork)); 152c4762a1bSJed Brown off = 0; 1539566063dSJacob Faibussowitsch PetscCall(PetscHMapIVGetPairs(htv, &off, karray, varray)); 1542c71b3e2SJacob Faibussowitsch PetscTestCheck(off == (2 * n)); 1559566063dSJacob Faibussowitsch PetscCall(PetscSortIntWithDataArray(off, karray, varray, sizeof(PetscScalar), vwork)); 156c4762a1bSJed Brown for (i = 0; i < n; i++) { 1572c71b3e2SJacob Faibussowitsch PetscTestCheck(karray[i] == (i + 100)); 1582c71b3e2SJacob Faibussowitsch PetscTestCheck(karray[n + i] == (n + i + 100)); 1592c71b3e2SJacob Faibussowitsch PetscTestCheck(varray[i] == 15.); 1602c71b3e2SJacob Faibussowitsch PetscTestCheck(varray[n + i] == 5.); 161c4762a1bSJed Brown } 1629566063dSJacob Faibussowitsch PetscCall(PetscFree3(karray, varray, vwork)); 1639566063dSJacob Faibussowitsch PetscCall(PetscHMapIVDestroy(&htv)); 164c4762a1bSJed Brown 1659566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 166b122ec5aSJacob Faibussowitsch return 0; 167c4762a1bSJed Brown } 168c4762a1bSJed Brown 169c4762a1bSJed Brown /*TEST 170c4762a1bSJed Brown 171c4762a1bSJed Brown test: 172c4762a1bSJed Brown 173c4762a1bSJed Brown TEST*/ 174