1 | /* Shared definitions for dynarray tests. |
2 | Copyright (C) 2017-2022 Free Software Foundation, Inc. |
3 | This file is part of the GNU C Library. |
4 | |
5 | The GNU C Library is free software; you can redistribute it and/or |
6 | modify it under the terms of the GNU Lesser General Public |
7 | License as published by the Free Software Foundation; either |
8 | version 2.1 of the License, or (at your option) any later version. |
9 | |
10 | The GNU C Library is distributed in the hope that it will be useful, |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
13 | Lesser General Public License for more details. |
14 | |
15 | You should have received a copy of the GNU Lesser General Public |
16 | License along with the GNU C Library; if not, see |
17 | <https://www.gnu.org/licenses/>. */ |
18 | |
19 | #include <stddef.h> |
20 | |
21 | struct int_array |
22 | { |
23 | int *array; |
24 | size_t length; |
25 | }; |
26 | |
27 | #define DYNARRAY_STRUCT dynarray_int |
28 | #define DYNARRAY_ELEMENT int |
29 | #define DYNARRAY_PREFIX dynarray_int_ |
30 | #define DYNARRAY_FINAL_TYPE struct int_array |
31 | #include <malloc/dynarray-skeleton.c> |
32 | |
33 | struct str_array |
34 | { |
35 | char **array; |
36 | size_t length; |
37 | }; |
38 | |
39 | #define DYNARRAY_STRUCT dynarray_str |
40 | #define DYNARRAY_ELEMENT char * |
41 | #define DYNARRAY_ELEMENT_FREE(ptr) free (*ptr) |
42 | #define DYNARRAY_PREFIX dynarray_str_ |
43 | #define DYNARRAY_FINAL_TYPE struct str_array |
44 | #include <malloc/dynarray-skeleton.c> |
45 | |
46 | /* Check that *DYN is equivalent to its initial state. */ |
47 | #define CHECK_INIT_STATE(type, dyn) \ |
48 | ({ \ |
49 | TEST_VERIFY_EXIT (!dynarray_##type##_has_failed (dyn)); \ |
50 | TEST_VERIFY_EXIT (dynarray_##type##_size (dyn) == 0); \ |
51 | TEST_VERIFY_EXIT ((dyn)->u.dynarray_header.array \ |
52 | == (dyn)->scratch); \ |
53 | TEST_VERIFY_EXIT ((dyn)->u.dynarray_header.allocated > 0); \ |
54 | (void) 0; \ |
55 | }) |
56 | |
57 | /* Check that *DYN behaves as if it is in its initial state. */ |
58 | #define CHECK_EMPTY(type, dyn) \ |
59 | ({ \ |
60 | CHECK_INIT_STATE (type, (dyn)); \ |
61 | dynarray_##type##_free (dyn); \ |
62 | CHECK_INIT_STATE (type, (dyn)); \ |
63 | dynarray_##type##_clear (dyn); \ |
64 | CHECK_INIT_STATE (type, (dyn)); \ |
65 | dynarray_##type##_remove_last (dyn); \ |
66 | CHECK_INIT_STATE (type, (dyn)); \ |
67 | dynarray_##type##_mark_failed (dyn); \ |
68 | TEST_VERIFY_EXIT (dynarray_##type##_has_failed (dyn)); \ |
69 | dynarray_##type##_clear (dyn); \ |
70 | TEST_VERIFY_EXIT (dynarray_##type##_has_failed (dyn)); \ |
71 | dynarray_##type##_remove_last (dyn); \ |
72 | TEST_VERIFY_EXIT (dynarray_##type##_has_failed (dyn)); \ |
73 | TEST_VERIFY_EXIT (dynarray_##type##_emplace (dyn) == NULL); \ |
74 | dynarray_##type##_free (dyn); \ |
75 | CHECK_INIT_STATE (type, (dyn)); \ |
76 | /* These functions should not assert. */ \ |
77 | dynarray_##type##_begin (dyn); \ |
78 | dynarray_##type##_end (dyn); \ |
79 | (void) 0; \ |
80 | }) |
81 | |