1 static char help[] = "Test PETSc integer hash set.\n\n"; 2 3 #include <petsc/private/hashseti.h> 4 #include <petscsys.h> 5 6 #define PetscTestCheck(expr) PetscCheck(expr, PETSC_COMM_SELF, PETSC_ERR_LIB, "Assertion: `%s' failed.", PetscStringize(expr)) 7 8 int main(int argc, char **argv) { 9 PetscHSetI ht = NULL, hd; 10 PetscInt n, off, array[4], na, nb, i, *marray, size; 11 PetscBool has, flag; 12 13 PetscFunctionBeginUser; 14 PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 15 16 PetscCall(PetscHSetICreate(&ht)); 17 PetscTestCheck(ht != NULL); 18 PetscCall(PetscHSetIGetSize(ht, &n)); 19 PetscTestCheck(n == 0); 20 21 PetscCall(PetscHSetIResize(ht, 0)); 22 PetscCall(PetscHSetIGetSize(ht, &n)); 23 PetscTestCheck(n == 0); 24 25 PetscCall(PetscHSetIHas(ht, 42, &has)); 26 PetscTestCheck(has == PETSC_FALSE); 27 28 PetscCall(PetscHSetIAdd(ht, 42)); 29 PetscCall(PetscHSetIGetSize(ht, &n)); 30 PetscTestCheck(n == 1); 31 PetscCall(PetscHSetIHas(ht, 42, &has)); 32 PetscTestCheck(has == PETSC_TRUE); 33 34 PetscCall(PetscHSetIDel(ht, 42)); 35 PetscCall(PetscHSetIGetSize(ht, &n)); 36 PetscTestCheck(n == 0); 37 PetscCall(PetscHSetIHas(ht, 42, &has)); 38 PetscTestCheck(has == PETSC_FALSE); 39 PetscCall(PetscHSetIDel(ht, 42)); 40 PetscCall(PetscHSetIDel(ht, 24)); 41 42 PetscCall(PetscHSetIQueryAdd(ht, 123, &flag)); 43 PetscTestCheck(flag == PETSC_TRUE); 44 PetscCall(PetscHSetIQueryAdd(ht, 123, &flag)); 45 PetscTestCheck(flag == PETSC_FALSE); 46 PetscCall(PetscHSetIQueryDel(ht, 123, &flag)); 47 PetscTestCheck(flag == PETSC_TRUE); 48 PetscCall(PetscHSetIQueryDel(ht, 123, &flag)); 49 PetscTestCheck(flag == PETSC_FALSE); 50 51 PetscCall(PetscHSetIResize(ht, 13)); 52 PetscCall(PetscHSetIGetSize(ht, &n)); 53 PetscTestCheck(n == 0); 54 55 PetscCall(PetscHSetIClear(ht)); 56 PetscCall(PetscHSetIGetSize(ht, &n)); 57 PetscTestCheck(n == 0); 58 59 PetscCall(PetscHSetIAdd(ht, 42)); 60 PetscCall(PetscHSetIAdd(ht, 13)); 61 PetscCall(PetscHSetIGetSize(ht, &n)); 62 PetscTestCheck(n == 2); 63 64 off = 0; 65 PetscCall(PetscHSetIGetElems(ht, &off, array)); 66 PetscCall(PetscSortInt(off, array)); 67 PetscTestCheck(off == 2); 68 PetscTestCheck(array[0] == 13); 69 PetscTestCheck(array[1] == 42); 70 PetscCall(PetscHSetIGetElems(ht, &off, array)); 71 PetscCall(PetscSortInt(2, array + 2)); 72 PetscTestCheck(off == 4); 73 PetscTestCheck(array[0] == 13); 74 PetscTestCheck(array[1] == 42); 75 PetscTestCheck(array[0] == 13); 76 PetscTestCheck(array[1] == 42); 77 78 off = 0; 79 PetscCall(PetscHSetIDuplicate(ht, &hd)); 80 PetscCall(PetscHSetIGetElems(hd, &off, array)); 81 PetscCall(PetscSortInt(off, array)); 82 PetscTestCheck(off == 2); 83 PetscTestCheck(array[0] == 13); 84 PetscTestCheck(array[1] == 42); 85 PetscCall(PetscHSetIDestroy(&hd)); 86 87 PetscCall(PetscHSetIAdd(ht, 0)); 88 PetscCall(PetscHSetIGetSize(ht, &n)); 89 PetscTestCheck(n != 0); 90 PetscCall(PetscHSetIReset(ht)); 91 PetscCall(PetscHSetIGetSize(ht, &n)); 92 PetscTestCheck(n == 0); 93 PetscCall(PetscHSetIReset(ht)); 94 PetscCall(PetscHSetIGetSize(ht, &n)); 95 PetscTestCheck(n == 0); 96 PetscCall(PetscHSetIAdd(ht, 0)); 97 PetscCall(PetscHSetIGetSize(ht, &n)); 98 PetscTestCheck(n != 0); 99 100 PetscCall(PetscHSetIDestroy(&ht)); 101 PetscTestCheck(ht == NULL); 102 103 PetscCall(PetscHSetICreate(&ht)); 104 PetscCall(PetscHSetIReset(ht)); 105 PetscCall(PetscHSetIGetSize(ht, &n)); 106 PetscTestCheck(n == 0); 107 PetscCall(PetscHSetIDestroy(&ht)); 108 109 PetscCall(PetscHSetICreate(&ht)); 110 PetscCall(PetscHSetICreate(&hd)); 111 n = 10; 112 PetscCall(PetscHSetIResize(ht, n)); 113 PetscCall(PetscHSetIResize(hd, n)); 114 PetscCall(PetscHSetIGetCapacity(ht, &na)); 115 PetscCall(PetscHSetIGetCapacity(hd, &nb)); 116 PetscTestCheck(na >= n); 117 PetscTestCheck(nb >= n); 118 for (i = 0; i < n; i++) { 119 PetscCall(PetscHSetIAdd(ht, i + 1)); 120 PetscCall(PetscHSetIAdd(hd, i + 1 + n)); 121 } 122 PetscCall(PetscHSetIGetCapacity(ht, &nb)); 123 PetscTestCheck(nb >= na); 124 /* Merge ht and hd, and the result is in ht */ 125 PetscCall(PetscHSetIUpdate(ht, hd)); 126 PetscCall(PetscHSetIDestroy(&hd)); 127 PetscCall(PetscHSetIGetSize(ht, &size)); 128 PetscTestCheck(size == (2 * n)); 129 PetscCall(PetscMalloc1(n * 2, &marray)); 130 off = 0; 131 PetscCall(PetscHSetIGetElems(ht, &off, marray)); 132 PetscCall(PetscHSetIDestroy(&ht)); 133 PetscTestCheck(off == (2 * n)); 134 PetscCall(PetscSortInt(off, marray)); 135 for (i = 0; i < n; i++) { 136 PetscTestCheck(marray[i] == (i + 1)); 137 PetscTestCheck(marray[n + i] == (i + 1 + n)); 138 } 139 PetscCall(PetscFree(marray)); 140 141 PetscCall(PetscFinalize()); 142 return 0; 143 } 144 145 /*TEST 146 147 test: 148 149 TEST*/ 150