int main(int argc, char *argv[]) { struct psc_vbitmap *vb, vba = VBITMAP_INIT_AUTO; size_t elem, j, cap, len, off; int i, c, u, t; pfl_init(); while ((c = getopt(argc, argv, "")) != -1) switch (c) { default: usage(); } argc -= optind; if (argc) usage(); for (i = 0; i < 79; i++) if (psc_vbitmap_next(&vba, &j) != 1) psc_fatalx("psc_vbitmap_next failed with auto"); else if (j != (size_t)i) psc_fatalx("elem %d is not supposed to be %zu", i, j); if ((vb = psc_vbitmap_new(213)) == NULL) psc_fatal("psc_vbitmap_new"); psc_vbitmap_setrange(vb, 13, 9); psc_vbitmap_printbin1(vb); for (i = 0; i < 13; i++) pfl_assert(psc_vbitmap_get(vb, i) == 0); for (j = 0; j < 9; j++, i++) pfl_assert(psc_vbitmap_get(vb, i) == 1); for (j = 0; j < 25; j++, i++) pfl_assert(psc_vbitmap_get(vb, i) == 0); psc_vbitmap_clearall(vb); for (i = 0; i < 213; i++) pfl_assert(psc_vbitmap_get(vb, i) == 0); psc_vbitmap_setrange(vb, 25, 3); for (i = 0; i < 25; i++) pfl_assert(psc_vbitmap_get(vb, i) == 0); for (j = 0; j < 3; j++, i++) pfl_assert(psc_vbitmap_get(vb, i) == 1); for (j = 0; j < 25; j++, i++) pfl_assert(psc_vbitmap_get(vb, i) == 0); psc_vbitmap_clearall(vb); for (i = 0; i < 213; i++) pfl_assert(psc_vbitmap_get(vb, i) == 0); for (i = 0; i < 213; i++) if (!psc_vbitmap_next(vb, &elem)) psc_fatalx("out of elements at pos %d", i); if (psc_vbitmap_next(vb, &elem)) psc_fatalx("an unexpected extra unused elem was found; pos=%zu", elem); psc_vbitmap_getstats(vb, &u, &t); if (u != 213 || t != 213) psc_fatalx("wrong size, got %d,%d want %d", u, t, 213); psc_vbitmap_unsetrange(vb, 13, 2); for (i = 0; i < 13; i++) pfl_assert(psc_vbitmap_get(vb, i) == 1); for (j = 0; j < 2; j++, i++) pfl_assert(psc_vbitmap_get(vb, i) == 0); for (j = 0; j < 25; j++, i++) pfl_assert(psc_vbitmap_get(vb, i) == 1); if (psc_vbitmap_resize(vb, NELEM) == -1) psc_fatal("psc_vbitmap_resize"); pfl_assert(psc_vbitmap_getsize(vb) == NELEM); /* fill up bitmap */ for (i = 0; i < NELEM - 211; i++) if (!psc_vbitmap_next(vb, &elem)) psc_fatalx("out of elements at iter %d", i); /* try one past end of filled bitmap */ if (psc_vbitmap_next(vb, &elem)) psc_fatalx("an unexpected extra unused elem was found; pos=%zu", elem); /* free some slots */ for (i = 0, elem = 0; elem < NELEM; i++, elem += NELEM / 10) psc_vbitmap_unset(vb, elem); t = psc_vbitmap_nfree(vb); if (t != i) psc_fatalx("wrong number of free elements; has=%d want=%d", t, i); psc_vbitmap_invert(vb); t = psc_vbitmap_nfree(vb); if (t != NELEM - i) psc_fatalx("wrong number of inverted elements; has=%d want=%d", t, NELEM - i); psc_vbitmap_invert(vb); t = psc_vbitmap_nfree(vb); if (t != i) psc_fatalx("wrong number of original elements; has=%d want=%d", t, i); /* try to re-grab the freed slots */ for (i = 0; i <= 10; i++) if (!psc_vbitmap_next(vb, &elem)) psc_fatalx("out of elements, request %d/%d", i, 10); /* try one past end of filled bitmap */ if (psc_vbitmap_next(vb, &elem)) psc_fatalx("an unexpected extra unused elem was found; pos=%zu", elem); psc_vbitmap_setval_range(vb, 0, NELEM, 0); CHECK_RANGE(vb, 0, 581, 371); CHECK_RANGE(vb, 0, 581, 1); pfl_assert(pfl_vbitmap_isempty(vb)); psc_vbitmap_setval_range(vb, 0, NELEM, 1); CHECK_RANGE(vb, 1, 581, 371); CHECK_RANGE(vb, 1, 581, 1); pfl_assert(psc_vbitmap_isfull(vb)); psc_vbitmap_free(vb); vb = psc_vbitmap_newf(0, PVBF_AUTO); pfl_assert(vb); pfl_assert(pfl_vbitmap_isempty(vb)); pfl_assert(psc_vbitmap_getsize(vb) == 0); pfl_assert(psc_vbitmap_resize(vb, 6) == 0); pfl_assert(psc_vbitmap_getsize(vb) == 6); pfl_assert(pfl_vbitmap_isempty(vb)); psc_vbitmap_free(vb); vb = psc_vbitmap_newf(0, PVBF_AUTO); cap = psc_vbitmap_getsize(vb); off = 0; len = 6; if (off + len > cap) psc_vbitmap_resize(vb, off + len); psc_vbitmap_setrange(vb, off, len); ENSURE(vb, "111111"); CHECK_RANGE(vb, 1, 2, 4); psc_vbitmap_clearall(vb); pfl_assert(psc_vbitmap_setval_range(vb, 2, 4, 1) == 0); CHECK_RANGE(vb, 1, 2, 4); ENSURE(vb, "001111"); psc_vbitmap_free(vb); vb = psc_vbitmap_new(0); for (i = 1; i < 101; i++) { if (psc_vbitmap_resize(vb, i) == -1) psc_fatal("psc_vbitmap_new"); psc_vbitmap_setval(vb, i - 1, i % 2); pfl_assert(psc_vbitmap_get(vb, i - 1) == i % 2); } psc_vbitmap_free(vb); for (cap = 0; cap < 100; cap++) { for (off = 1; off < cap; off++) { for (len = 1; off + len < cap; len++) { size_t last; last = cap - off - len; vb = psc_vbitmap_new(cap); psc_vbitmap_setrange(vb, off, len); ENSURE(vb, "%0*d%*d%0*d", (int)off, 0, (int)len, 1, (int)last, 0); CHECK_RANGE(vb, 0, 0, off); CHECK_RANGE(vb, 1, off, len); CHECK_RANGE(vb, 0, off+len, last); psc_vbitmap_free(vb); } } } vb = psc_vbitmap_new(8200); pfl_assert(pfl_vbitmap_isempty(vb)); CHECK_RANGE(vb, 0, 8, 8192); psc_vbitmap_free(vb); vb = psc_vbitmap_new(16); ENSURE_ABBR(vb, "0:8,00000000"); psc_vbitmap_free(vb); vb = psc_vbitmap_new(40); psc_vbitmap_setval_range(vb, 0, 10, 0); psc_vbitmap_setval_range(vb, 10, 10, 1); ENSURE(vb, "0000000000111111111100000000000000000000"); ENSURE_ABBR(vb, "0:10,1:10,0:12,00000000"); psc_vbitmap_free(vb); vb = psc_vbitmap_new(16); ENSURE(vb, "0000000000000000"); pfl_assert(pfl_vbitmap_isempty(vb)); CHECK_RANGE(vb, 0, 8, 8); CHECK_RANGE(vb, 0, 9, 7); psc_vbitmap_setval(vb, 15, 1); ENSURE(vb, "0000000000000001"); CHECK_RANGE(vb, 0, 9, 6); CHECK_RANGE(vb, 1, 15, 1); pfl_assert(pfl_vbitmap_israngeset(vb, 0, 8, 8) == 0); pfl_assert(pfl_vbitmap_israngeset(vb, 1, 8, 8) == 0); psc_vbitmap_clearall(vb); pfl_assert(pfl_vbitmap_isempty(vb)); psc_vbitmap_free(vb); exit(0); }
int main(int argc, char *argv[]) { struct psc_vbitmap *vb, vba = VBITMAP_INIT_AUTO; int i, c, u, t; size_t elem, j; pfl_init(); progname = argv[0]; while ((c = getopt(argc, argv, "")) != -1) switch (c) { default: usage(); } argc -= optind; if (argc) usage(); for (i = 0; i < 79; i++) if (psc_vbitmap_next(&vba, &j) != 1) psc_fatalx("psc_vbitmap_next failed with auto"); else if (j != (size_t)i) psc_fatalx("elem %d is not supposed to be %zu", i, j); if ((vb = psc_vbitmap_new(213)) == NULL) psc_fatal("psc_vbitmap_new"); psc_vbitmap_setrange(vb, 13, 9); psc_vbitmap_printbin1(vb); for (i = 0; i < 13; i++) psc_assert(psc_vbitmap_get(vb, i) == 0); for (j = 0; j < 9; j++, i++) psc_assert(psc_vbitmap_get(vb, i) == 1); for (j = 0; j < 25; j++, i++) psc_assert(psc_vbitmap_get(vb, i) == 0); psc_vbitmap_clearall(vb); for (i = 0; i < 213; i++) psc_assert(psc_vbitmap_get(vb, i) == 0); psc_vbitmap_setrange(vb, 25, 3); for (i = 0; i < 25; i++) psc_assert(psc_vbitmap_get(vb, i) == 0); for (j = 0; j < 3; j++, i++) psc_assert(psc_vbitmap_get(vb, i) == 1); for (j = 0; j < 25; j++, i++) psc_assert(psc_vbitmap_get(vb, i) == 0); psc_vbitmap_clearall(vb); for (i = 0; i < 213; i++) psc_assert(psc_vbitmap_get(vb, i) == 0); for (i = 0; i < 213; i++) if (!psc_vbitmap_next(vb, &elem)) psc_fatalx("out of elements at pos %d", i); if (psc_vbitmap_next(vb, &elem)) psc_fatalx("an unexpected extra unused elem was found; pos=%zu", elem); psc_vbitmap_getstats(vb, &u, &t); if (u != 213 || t != 213) psc_fatalx("wrong size, got %d,%d want %d", u, t, 213); psc_vbitmap_unsetrange(vb, 13, 2); for (i = 0; i < 13; i++) psc_assert(psc_vbitmap_get(vb, i) == 1); for (j = 0; j < 2; j++, i++) psc_assert(psc_vbitmap_get(vb, i) == 0); for (j = 0; j < 25; j++, i++) psc_assert(psc_vbitmap_get(vb, i) == 1); if (psc_vbitmap_resize(vb, NELEM) == -1) psc_fatal("psc_vbitmap_new"); psc_assert(psc_vbitmap_getsize(vb) == NELEM); /* fill up bitmap */ for (i = 0; i < NELEM - 211; i++) if (!psc_vbitmap_next(vb, &elem)) psc_fatalx("out of elements at iter %d", i); /* try one past end of filled bitmap */ if (psc_vbitmap_next(vb, &elem)) psc_fatalx("an unexpected extra unused elem was found; pos=%zu", elem); /* free some slots */ for (i = 0, elem = 0; elem < NELEM; i++, elem += NELEM / 10) psc_vbitmap_unset(vb, elem); t = psc_vbitmap_nfree(vb); if (t != i) psc_fatalx("wrong number of free elements; has=%d want=%d", t, i); psc_vbitmap_invert(vb); t = psc_vbitmap_nfree(vb); if (t != NELEM - i) psc_fatalx("wrong number of inverted elements; has=%d want=%d", t, NELEM - i); psc_vbitmap_invert(vb); t = psc_vbitmap_nfree(vb); if (t != i) psc_fatalx("wrong number of original elements; has=%d want=%d", t, i); /* try to re-grab the freed slots */ for (i = 0; i <= 10; i++) if (!psc_vbitmap_next(vb, &elem)) psc_fatalx("out of elements, request %d/%d", i, 10); /* try one past end of filled bitmap */ if (psc_vbitmap_next(vb, &elem)) psc_fatalx("an unexpected extra unused elem was found; pos=%zu", elem); psc_vbitmap_setval_range(vb, 0, NELEM, 0); psc_assert(pfl_vbitmap_israngeset(vb, 0, 581, 371)); psc_assert(pfl_vbitmap_israngeset(vb, 1, 581, 371) == 0); psc_assert(pfl_vbitmap_israngeset(vb, 0, 581, 1)); psc_assert(pfl_vbitmap_israngeset(vb, 1, 581, 1) == 0); psc_assert(pfl_vbitmap_isempty(vb)); psc_vbitmap_setval_range(vb, 0, NELEM, 1); psc_assert(pfl_vbitmap_israngeset(vb, 1, 581, 371)); psc_assert(pfl_vbitmap_israngeset(vb, 0, 581, 371) == 0); psc_assert(pfl_vbitmap_israngeset(vb, 1, 581, 1)); psc_assert(pfl_vbitmap_israngeset(vb, 0, 581, 1) == 0); psc_assert(psc_vbitmap_isfull(vb)); psc_vbitmap_free(vb); vb = psc_vbitmap_new(0); for (i = 1; i < 101; i++) { if (psc_vbitmap_resize(vb, i) == -1) psc_fatal("psc_vbitmap_new"); psc_vbitmap_setval(vb, i - 1, i % 2); psc_assert(psc_vbitmap_get(vb, i - 1) == i % 2); } exit(0); }