Actual source code: ex40.c

  1: static char help[] = "Test PETSc integer hash map.\n\n";

  3: #include <petsc/private/hashmapi.h>
  4: #include <petsc/private/hashmapiv.h>
  5: #include <petscsys.h>

  7: /* Unused, keep it for testing purposes */
  8: PETSC_HASH_MAP(HMapIP, PetscInt, void *, PetscHashInt, PetscHashEqual, NULL)

 10: /* Unused, keep it for testing purposes */
 11: typedef struct {
 12:   double x;
 13:   double y;
 14:   double z;
 15: } Point;
 16: static Point origin = {0.0, 0.0, 0.0};
 17: PETSC_HASH_MAP(HMapIS, PetscInt, Point, PetscHashInt, PetscHashEqual, origin)

 19: #define PetscTestCheck(expr) PetscCheck(expr, PETSC_COMM_SELF, PETSC_ERR_LIB, "Assertion: `%s' failed.", PetscStringize(expr))

 21: int main(int argc, char **argv)
 22: {
 23:   PetscHMapI   ht = NULL, hd;
 24:   PetscHMapIV  htv;
 25:   PetscInt     n, v, koff, keys[4], voff, vals[4], na, nb, i, size, *karray, off;
 26:   PetscScalar *varray, *vwork;
 27:   PetscBool    has, flag;

 29:   PetscFunctionBeginUser;
 30:   PetscCall(PetscInitialize(&argc, &argv, NULL, help));

 32:   PetscCall(PetscHMapICreate(&ht));
 33:   PetscTestCheck(ht != NULL);
 34:   PetscCall(PetscHMapIGetSize(ht, &n));
 35:   PetscTestCheck(n == 0);

 37:   PetscCall(PetscHMapIResize(ht, 0));
 38:   PetscCall(PetscHMapIGetSize(ht, &n));
 39:   PetscTestCheck(n == 0);

 41:   PetscCall(PetscHMapIHas(ht, 123, &has));
 42:   PetscTestCheck(has == PETSC_FALSE);
 43:   PetscCall(PetscHMapIGet(ht, 123, &v));
 44:   PetscTestCheck(v == -1);

 46:   PetscCall(PetscHMapISet(ht, 123, 42));
 47:   PetscCall(PetscHMapIGetSize(ht, &n));
 48:   PetscTestCheck(n == 1);
 49:   PetscCall(PetscHMapIHas(ht, 123, &has));
 50:   PetscTestCheck(has == PETSC_TRUE);
 51:   PetscCall(PetscHMapIGet(ht, 123, &v));
 52:   PetscTestCheck(v == 42);

 54:   PetscCall(PetscHMapIDel(ht, 123));
 55:   PetscCall(PetscHMapIGetSize(ht, &n));
 56:   PetscTestCheck(n == 0);
 57:   PetscCall(PetscHMapIHas(ht, 123, &has));
 58:   PetscTestCheck(has == PETSC_FALSE);
 59:   PetscCall(PetscHMapIGet(ht, 123, &v));
 60:   PetscTestCheck(v == -1);

 62:   PetscCall(PetscHMapIQuerySet(ht, 123, 1, &flag));
 63:   PetscTestCheck(flag == PETSC_TRUE);
 64:   PetscCall(PetscHMapIQuerySet(ht, 123, 1, &flag));
 65:   PetscTestCheck(flag == PETSC_FALSE);
 66:   PetscCall(PetscHMapIQueryDel(ht, 123, &flag));
 67:   PetscTestCheck(flag == PETSC_TRUE);
 68:   PetscCall(PetscHMapIQueryDel(ht, 123, &flag));
 69:   PetscTestCheck(flag == PETSC_FALSE);

 71:   PetscCall(PetscHMapIResize(ht, 13));
 72:   PetscCall(PetscHMapIGetSize(ht, &n));
 73:   PetscTestCheck(n == 0);

 75:   PetscCall(PetscHMapIClear(ht));
 76:   PetscCall(PetscHMapIGetSize(ht, &n));
 77:   PetscTestCheck(n == 0);

 79:   PetscCall(PetscHMapISet(ht, 321, 24));
 80:   PetscCall(PetscHMapISet(ht, 123, 42));
 81:   PetscCall(PetscHMapIGetSize(ht, &n));
 82:   PetscTestCheck(n == 2);

 84:   koff    = 0;
 85:   keys[0] = keys[1] = 0;
 86:   PetscCall(PetscHMapIGetKeys(ht, &koff, keys));
 87:   PetscCall(PetscSortInt(koff, keys));
 88:   PetscTestCheck(koff == 2);
 89:   PetscTestCheck(keys[0] == 123);
 90:   PetscTestCheck(keys[1] == 321);

 92:   voff    = 0;
 93:   vals[0] = vals[1] = 0;
 94:   PetscCall(PetscHMapIGetVals(ht, &voff, vals));
 95:   PetscCall(PetscSortInt(voff, vals));
 96:   PetscTestCheck(voff == 2);
 97:   PetscTestCheck(vals[0] == 24);
 98:   PetscTestCheck(vals[1] == 42);

100:   koff    = 0;
101:   keys[0] = keys[1] = 0;
102:   voff              = 0;
103:   vals[0] = vals[1] = 0;
104:   PetscCall(PetscHMapIDuplicate(ht, &hd));
105:   PetscCall(PetscHMapIGetKeys(ht, &koff, keys));
106:   PetscCall(PetscHMapIGetVals(ht, &voff, vals));
107:   PetscCall(PetscSortInt(koff, keys));
108:   PetscCall(PetscSortInt(voff, vals));
109:   PetscTestCheck(koff == 2);
110:   PetscTestCheck(voff == 2);
111:   PetscTestCheck(keys[0] == 123);
112:   PetscTestCheck(keys[1] == 321);
113:   PetscTestCheck(vals[0] == 24);
114:   PetscTestCheck(vals[1] == 42);
115:   PetscCall(PetscHMapIDestroy(&hd));

117:   PetscCall(PetscHMapISet(ht, 0, 0));
118:   PetscCall(PetscHMapIGetSize(ht, &n));
119:   PetscTestCheck(n != 0);
120:   PetscCall(PetscHMapIReset(ht));
121:   PetscCall(PetscHMapIGetSize(ht, &n));
122:   PetscTestCheck(n == 0);
123:   PetscCall(PetscHMapIReset(ht));
124:   PetscCall(PetscHMapIGetSize(ht, &n));
125:   PetscTestCheck(n == 0);
126:   PetscCall(PetscHMapISet(ht, 0, 0));
127:   PetscCall(PetscHMapIGetSize(ht, &n));
128:   PetscTestCheck(n != 0);

130:   PetscCall(PetscHMapIDestroy(&ht));
131:   PetscTestCheck(ht == NULL);

133:   PetscCall(PetscHMapICreate(&ht));
134:   PetscCall(PetscHMapIReset(ht));
135:   PetscCall(PetscHMapIGetSize(ht, &n));
136:   PetscTestCheck(n == 0);
137:   PetscCall(PetscHMapIDestroy(&ht));

139:   PetscCall(PetscHMapIVCreate(&htv));
140:   n = 10;
141:   PetscCall(PetscHMapIVResize(htv, n));
142:   PetscCall(PetscHMapIVGetCapacity(htv, &na));
143:   PetscTestCheck(na >= n);
144:   for (i = 0; i < n; i++) PetscCall(PetscHMapIVSet(htv, i + 100, 10.));

146:   PetscCall(PetscHMapIVGetCapacity(htv, &nb));
147:   PetscTestCheck(nb >= na);
148:   for (i = 0; i < (2 * n); i++) PetscCall(PetscHMapIVAddValue(htv, i + 100, 5.));

150:   PetscCall(PetscHMapIVGetSize(htv, &size));
151:   PetscTestCheck(size == (2 * n));
152:   PetscCall(PetscMalloc3(size, &karray, size, &varray, size, &vwork));
153:   off = 0;
154:   PetscCall(PetscHMapIVGetPairs(htv, &off, karray, varray));
155:   PetscTestCheck(off == (2 * n));
156:   PetscCall(PetscSortIntWithDataArray(off, karray, varray, sizeof(PetscScalar), vwork));
157:   for (i = 0; i < n; i++) {
158:     PetscTestCheck(karray[i] == (i + 100));
159:     PetscTestCheck(karray[n + i] == (n + i + 100));
160:     PetscTestCheck(varray[i] == 15.);
161:     PetscTestCheck(varray[n + i] == 5.);
162:   }
163:   PetscCall(PetscFree3(karray, varray, vwork));
164:   PetscCall(PetscHMapIVDestroy(&htv));

166:   PetscCall(PetscFinalize());
167:   return 0;
168: }

170: /*TEST

172:    test:

174: TEST*/