diff --git a/src/libknot/dynarray.h b/src/libknot/dynarray.h index 9ff14d083ab7595a4cd27a293911ec4645dc415b..e9f699ef788f64abacc43d304c87951bfbdfd8a1 100644 --- a/src/libknot/dynarray.h +++ b/src/libknot/dynarray.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2021 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz> +/* Copyright (C) 2022 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz> This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -147,6 +147,13 @@ } \ \ _unused_ \ + visibility ntype *prefix ## _dynarray_bsearch(struct prefix ## _dynarray *dynarray, const ntype *bskey) \ + { \ + ntype *arr = prefix ## _dynarray_arr(dynarray); \ + return bsearch(bskey, arr, dynarray->size, sizeof(*arr), prefix ## _dynarray_memb_cmp); \ + } \ + \ + _unused_ \ visibility void prefix ## _dynarray_sort_dedup(struct prefix ## _dynarray *dynarray) \ { \ if (dynarray->size > 1) { \ diff --git a/tests/contrib/test_dynarray.c b/tests/contrib/test_dynarray.c index a4ca922ec9896a52ec7b88e3712874b9525dbc30..ac1e0f1804f4efa3de40d7da22cd0bd370334b82 100644 --- a/tests/contrib/test_dynarray.c +++ b/tests/contrib/test_dynarray.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2021 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz> +/* Copyright (C) 2022 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz> This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -117,5 +117,21 @@ int main(int argc, char *argv[]) q_dynarray_free(&q); + // binary search removal test + q = q_fill(test_capacity * 10); + for (int i = 0; i < test_capacity * 10; i++) { + quadrate_t qu = { i, i * i }; + if ((qu.x % 2) == 0) { + q_dynarray_remove(&q, &qu); + } + } + q_dynarray_sort(&q); + for (int i = 0; i < test_capacity * 10; i++) { + quadrate_t qu = { i, i * i }; + int present = (q_dynarray_bsearch(&q, &qu) != NULL ? 1 : 0); + ok(present == (i % 2), "presence in sorted array %d", i); + } + q_dynarray_free(&q); + return 0; }