// NOTE: only intended for performance testing #define PK_ARR_MOVE_IN_PLACE #include "../pkarr.h" struct some_complex_struct { char uhh; union { uint8_t chr[8]; uint16_t shrt[4]; uint32_t in[2]; uint64_t lng; }; char okay; }; void test_spinup(struct pk_arr *arr, struct pk_membucket **bkt) { memset(arr, 0, sizeof(struct pk_arr)); *bkt = pk_bucket_create("test", 1024 * 1024, false); arr->bkt = *bkt; } void test_teardown(struct pk_arr *arr, struct pk_membucket **bkt) { pk_bucket_destroy(*bkt); *bkt = NULL; arr->data = NULL; } bool find_uint8(void *user_data, void *item) { return memcmp(user_data, item, sizeof(uint8_t)) == 0; } int main(int argc, char *argv[]) { (void)argc; (void)argv; uint64_t i; struct pk_arr arr = {0}; struct pk_membucket *bkt = {0}; struct some_complex_struct cmplx_strct = {0}; /* template { test_spinup(&arr, &bkt); test_teardown(&arr, &bkt); } */ // init via append, soft clear { test_spinup(&arr, &bkt); arr.stride = sizeof(uint8_t); arr.alignment = alignof(uint8_t); uint8_t c = 255; pk_arr_append(&arr, &c); if (arr.bkt == NULL) exit(1); if (arr.data == NULL) exit(1); if (arr.reserved == 0) exit(1); if (arr.next != 1) exit(1); pk_arr_clear(&arr); if (arr.bkt == NULL) exit(1); if (arr.data == NULL) exit(1); if (arr.reserved == 0) exit(1); if (arr.next != 0) exit(1); test_teardown(&arr, &bkt); } // movement { test_spinup(&arr, &bkt); arr.stride = sizeof(uint64_t); arr.alignment = alignof(uint64_t); for (i = 0; i < 5; ++i) { pk_arr_append(&arr, &i); } pk_arr_move_to_back(&arr, 2); if (arr.bkt == NULL) exit(1); if (arr.data == NULL) exit(1); if (arr.reserved == 0) exit(1); if (arr.next != 5) exit(1); uint64_t *vals = (uint64_t *)arr.data; if (0 != vals[0]) exit(1); if (1 != vals[1]) exit(1); if (3 != vals[2]) exit(1); if (4 != vals[3]) exit(1); if (2 != vals[4]) exit(1); test_teardown(&arr, &bkt); } // complex movement { test_spinup(&arr, &bkt); arr.stride = sizeof(struct some_complex_struct); arr.alignment = alignof(struct some_complex_struct); for (i = 0; i < 5; ++i) { cmplx_strct.uhh = (char)i; cmplx_strct.lng = (uint64_t)i; cmplx_strct.okay = (char)i; pk_arr_append(&arr, &cmplx_strct); } pk_arr_move_to_back(&arr, 2); if (arr.bkt == NULL) exit(1); if (arr.data == NULL) exit(1); if (arr.reserved == 0) exit(1); if (arr.next != 5) exit(1); struct some_complex_struct *vals = (struct some_complex_struct*)arr.data; if (0 != vals[0].lng) exit(1); if (1 != vals[1].lng) exit(1); if (3 != vals[2].lng) exit(1); if (4 != vals[3].lng) exit(1); if (2 != vals[4].lng) exit(1); test_teardown(&arr, &bkt); } // resize (implicit reserve) + grow { test_spinup(&arr, &bkt); arr.stride = sizeof(uint8_t); arr.alignment = alignof(uint8_t); pk_arr_resize(&arr, 17); uint8_t *typed_buffer = (uint8_t *)arr.data; if (arr.bkt == NULL) exit(1); if (arr.data == NULL) exit(1); if (arr.reserved != 17) exit(1); if (arr.next != 17) exit(1); for (i = 0; i < 17; ++i) { typed_buffer[i] = (uint8_t)i; } uint8_t v = 17; pk_arr_append(&arr, &v); if (arr.bkt == NULL) exit(1); if (arr.data == NULL) exit(1); if (arr.reserved == 17) exit(1); if (arr.next != 18) exit(1); test_teardown(&arr, &bkt); } // remove_at back, middle, front { test_spinup(&arr, &bkt); arr.stride = sizeof(uint64_t); arr.alignment = alignof(uint64_t); for (i = 0; i < 5; ++i) { pk_arr_append(&arr, &i); } pk_arr_remove_at(&arr, 4); // back if (arr.bkt == NULL) exit(1); if (arr.data == NULL) exit(1); if (arr.reserved == 0) exit(1); if (arr.next != 4) exit(1); uint64_t *vals = (uint64_t *)arr.data; if (0 != vals[0]) exit(1); if (1 != vals[1]) exit(1); if (2 != vals[2]) exit(1); if (3 != vals[3]) exit(1); pk_arr_remove_at(&arr, 2); // middle if (arr.bkt == NULL) exit(1); if (arr.data == NULL) exit(1); if (arr.reserved == 0) exit(1); if (arr.next != 3) exit(1); vals = (uint64_t *)arr.data; if (0 != vals[0]) exit(1); if (1 != vals[1]) exit(1); if (3 != vals[2]) exit(1); pk_arr_remove_at(&arr, 0); // front if (arr.bkt == NULL) exit(1); if (arr.data == NULL) exit(1); if (arr.reserved == 0) exit(1); if (arr.next != 2) exit(1); vals = (uint64_t *)arr.data; if (1 != vals[0]) exit(1); if (3 != vals[1]) exit(1); test_teardown(&arr, &bkt); } // init via append, soft clear { test_spinup(&arr, &bkt); arr.stride = sizeof(uint8_t); arr.alignment = alignof(uint8_t); uint8_t c1 = 127; uint8_t c2 = 128; pk_arr_append(&arr, &c1); i = pk_arr_find_first_index(&arr, &c1, find_uint8); if (0 != i) exit(1); i = pk_arr_find_first_index(&arr, &c2, find_uint8); if (0xFFFFFFFF != i) exit(1); test_teardown(&arr, &bkt); } return 0; }