Mercurial > dovecot > core-2.2
annotate src/lib/array.h @ 22664:fea53c2725c0
director: Fix director_max_parallel_moves/kicks type
Should be uint, not time.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Thu, 09 Nov 2017 12:24:16 +0200 |
parents | 2ab0c5855548 |
children |
rev | line source |
---|---|
6410
e4eb71ae8e96
Changed .h ifdef/defines to use <NAME>_H format.
Timo Sirainen <tss@iki.fi>
parents:
5476
diff
changeset
|
1 #ifndef ARRAY_H |
e4eb71ae8e96
Changed .h ifdef/defines to use <NAME>_H format.
Timo Sirainen <tss@iki.fi>
parents:
5476
diff
changeset
|
2 #define ARRAY_H |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
4 /* Array is a buffer accessible using fixed size elements. As long as the |
18090
77638cc62ca8
lib: array/hash - enable typof checks for more compilers
Phil Carmody <phil@dovecot.fi>
parents:
18089
diff
changeset
|
5 compiler provides a typeof() operator, the array provides type safety. If |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
6 a wrong type is tried to be added to the array, or if the array's contents |
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
7 are tried to be used using a wrong type, the compiler will give a warning. |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 Example usage: |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 struct foo { |
14920
a097ef0a9d6d
Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents:
14686
diff
changeset
|
12 ARRAY(struct bar) bars; |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 ... |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 }; |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 |
4596
bf4e98a0de3f
Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents:
4594
diff
changeset
|
16 i_array_init(&foo->bars, 10); |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 |
3193
d0adece8a6a0
Updated example code, it was using older API..
Timo Sirainen <tss@iki.fi>
parents:
3190
diff
changeset
|
18 struct bar *bar = array_idx(&foo->bars, 5); |
d0adece8a6a0
Updated example code, it was using older API..
Timo Sirainen <tss@iki.fi>
parents:
3190
diff
changeset
|
19 struct baz *baz = array_idx(&foo->bars, 5); // compiler warning |
3194
d5935326e06f
Renamed ARRAY_ARG_SET_TYPE() to ARRAY_SET_TYPE() and updated comments.
Timo Sirainen <tss@iki.fi>
parents:
3193
diff
changeset
|
20 |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
21 If you want to pass an array as a parameter to a function, you'll need to |
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
22 create a type for the array using ARRAY_DEFINE_TYPE() and use the type in |
18134
17ec2a11cf44
lib: array - explain implications of ARRAY_TYPE() in comment
Phil Carmody <phil@dovecot.fi>
parents:
18132
diff
changeset
|
23 the parameter using ARRAY_TYPE(). Any arrays that you want to be passing |
17ec2a11cf44
lib: array - explain implications of ARRAY_TYPE() in comment
Phil Carmody <phil@dovecot.fi>
parents:
18132
diff
changeset
|
24 around, such as structure members as in the above example, must also be |
17ec2a11cf44
lib: array - explain implications of ARRAY_TYPE() in comment
Phil Carmody <phil@dovecot.fi>
parents:
18132
diff
changeset
|
25 defined using ARRAY_TYPE() too, rather than ARRAY(). |
3194
d5935326e06f
Renamed ARRAY_ARG_SET_TYPE() to ARRAY_SET_TYPE() and updated comments.
Timo Sirainen <tss@iki.fi>
parents:
3193
diff
changeset
|
26 |
d5935326e06f
Renamed ARRAY_ARG_SET_TYPE() to ARRAY_SET_TYPE() and updated comments.
Timo Sirainen <tss@iki.fi>
parents:
3193
diff
changeset
|
27 Example: |
d5935326e06f
Renamed ARRAY_ARG_SET_TYPE() to ARRAY_SET_TYPE() and updated comments.
Timo Sirainen <tss@iki.fi>
parents:
3193
diff
changeset
|
28 |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
29 ARRAY_DEFINE_TYPE(foo, struct foo); |
18134
17ec2a11cf44
lib: array - explain implications of ARRAY_TYPE() in comment
Phil Carmody <phil@dovecot.fi>
parents:
18132
diff
changeset
|
30 void do_foo(ARRAY_TYPE(foo) *foos) { |
17ec2a11cf44
lib: array - explain implications of ARRAY_TYPE() in comment
Phil Carmody <phil@dovecot.fi>
parents:
18132
diff
changeset
|
31 struct foo *foo = array_idx(foos, 0); |
3194
d5935326e06f
Renamed ARRAY_ARG_SET_TYPE() to ARRAY_SET_TYPE() and updated comments.
Timo Sirainen <tss@iki.fi>
parents:
3193
diff
changeset
|
32 } |
18134
17ec2a11cf44
lib: array - explain implications of ARRAY_TYPE() in comment
Phil Carmody <phil@dovecot.fi>
parents:
18132
diff
changeset
|
33 struct foo_manager { |
17ec2a11cf44
lib: array - explain implications of ARRAY_TYPE() in comment
Phil Carmody <phil@dovecot.fi>
parents:
18132
diff
changeset
|
34 ARRAY_TYPE(foo) foos; // pedantically, ARRAY(struct foo) is a different type |
17ec2a11cf44
lib: array - explain implications of ARRAY_TYPE() in comment
Phil Carmody <phil@dovecot.fi>
parents:
18132
diff
changeset
|
35 }; |
17ec2a11cf44
lib: array - explain implications of ARRAY_TYPE() in comment
Phil Carmody <phil@dovecot.fi>
parents:
18132
diff
changeset
|
36 // ... |
17ec2a11cf44
lib: array - explain implications of ARRAY_TYPE() in comment
Phil Carmody <phil@dovecot.fi>
parents:
18132
diff
changeset
|
37 do_foo(&my_foo_manager->foos); // No compiler warning about mismatched types |
17ec2a11cf44
lib: array - explain implications of ARRAY_TYPE() in comment
Phil Carmody <phil@dovecot.fi>
parents:
18132
diff
changeset
|
38 |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 */ |
3470
346a494c2feb
Moved array declaration to array-decl.h and include it in lib.h. So array.h
Timo Sirainen <tss@iki.fi>
parents:
3445
diff
changeset
|
40 #include "array-decl.h" |
346a494c2feb
Moved array declaration to array-decl.h and include it in lib.h. So array.h
Timo Sirainen <tss@iki.fi>
parents:
3445
diff
changeset
|
41 #include "buffer.h" |
3196
b426b1d58296
#ifdefs were wrong, we need both __GNUC__ and DEBUG to do type checking.
Timo Sirainen <tss@iki.fi>
parents:
3194
diff
changeset
|
42 |
4596
bf4e98a0de3f
Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents:
4594
diff
changeset
|
43 #define p_array_init(array, pool, init_count) \ |
4807 | 44 array_create(array, pool, sizeof(**(array)->v), init_count) |
4596
bf4e98a0de3f
Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents:
4594
diff
changeset
|
45 #define i_array_init(array, init_count) \ |
bf4e98a0de3f
Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents:
4594
diff
changeset
|
46 p_array_init(array, default_pool, init_count) |
bf4e98a0de3f
Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents:
4594
diff
changeset
|
47 #define t_array_init(array, init_count) \ |
bf4e98a0de3f
Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents:
4594
diff
changeset
|
48 p_array_init(array, pool_datastack_create(), init_count) |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
49 |
18090
77638cc62ca8
lib: array/hash - enable typof checks for more compilers
Phil Carmody <phil@dovecot.fi>
parents:
18089
diff
changeset
|
50 #ifdef HAVE_TYPEOF |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
51 # define ARRAY_TYPE_CAST_CONST(array) \ |
4601
664011f3b1fb
Some more array changes. v and v_modifiable are now pointer-to-pointers so
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
52 (typeof(*(array)->v)) |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
53 # define ARRAY_TYPE_CAST_MODIFIABLE(array) \ |
4601
664011f3b1fb
Some more array changes. v and v_modifiable are now pointer-to-pointers so
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
54 (typeof(*(array)->v_modifiable)) |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
55 # define ARRAY_TYPE_CHECK(array, data) \ |
5476
0c096f057e24
Use COMPILE_ERROR_IF_TYPES_NOT_COMPATIBLE() for validating the data type.
Timo Sirainen <tss@iki.fi>
parents:
5075
diff
changeset
|
56 COMPILE_ERROR_IF_TYPES_NOT_COMPATIBLE( \ |
18089
922ac3245e17
lib: array/hash - protect macro parameters
Phil Carmody <phil@dovecot.fi>
parents:
14921
diff
changeset
|
57 **(array)->v_modifiable, *(data)) |
18111
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
58 # define ARRAY_TYPES_CHECK(array1, array2) \ |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
59 COMPILE_ERROR_IF_TYPES_NOT_COMPATIBLE( \ |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
60 **(array1)->v_modifiable, **(array2)->v_modifiable) |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
61 |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 #else |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
63 # define ARRAY_TYPE_CAST_CONST(array) |
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
64 # define ARRAY_TYPE_CAST_MODIFIABLE(array) |
5476
0c096f057e24
Use COMPILE_ERROR_IF_TYPES_NOT_COMPATIBLE() for validating the data type.
Timo Sirainen <tss@iki.fi>
parents:
5075
diff
changeset
|
65 # define ARRAY_TYPE_CHECK(array, data) 0 |
18111
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
66 # define ARRAY_TYPES_CHECK(array1, array2) 0 |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 #endif |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 |
9996
ada435a92e93
Added array_foreach() and array_foreach_modifiable().
Timo Sirainen <tss@iki.fi>
parents:
9607
diff
changeset
|
69 /* usage: struct foo *foo; array_foreach(foo_arr, foo) { .. } */ |
ada435a92e93
Added array_foreach() and array_foreach_modifiable().
Timo Sirainen <tss@iki.fi>
parents:
9607
diff
changeset
|
70 #if (defined(__STDC__) && __STDC_VERSION__ >= 199901L) |
ada435a92e93
Added array_foreach() and array_foreach_modifiable().
Timo Sirainen <tss@iki.fi>
parents:
9607
diff
changeset
|
71 # define array_foreach(array, elem) \ |
ada435a92e93
Added array_foreach() and array_foreach_modifiable().
Timo Sirainen <tss@iki.fi>
parents:
9607
diff
changeset
|
72 for (const void *elem ## __foreach_end = \ |
ada435a92e93
Added array_foreach() and array_foreach_modifiable().
Timo Sirainen <tss@iki.fi>
parents:
9607
diff
changeset
|
73 (const char *)(elem = *(array)->v) + (array)->arr.buffer->used; \ |
ada435a92e93
Added array_foreach() and array_foreach_modifiable().
Timo Sirainen <tss@iki.fi>
parents:
9607
diff
changeset
|
74 elem != elem ## __foreach_end; (elem)++) |
ada435a92e93
Added array_foreach() and array_foreach_modifiable().
Timo Sirainen <tss@iki.fi>
parents:
9607
diff
changeset
|
75 # define array_foreach_modifiable(array, elem) \ |
ada435a92e93
Added array_foreach() and array_foreach_modifiable().
Timo Sirainen <tss@iki.fi>
parents:
9607
diff
changeset
|
76 for (const void *elem ## _end = \ |
ada435a92e93
Added array_foreach() and array_foreach_modifiable().
Timo Sirainen <tss@iki.fi>
parents:
9607
diff
changeset
|
77 (const char *)(elem = ARRAY_TYPE_CAST_MODIFIABLE(array) \ |
ada435a92e93
Added array_foreach() and array_foreach_modifiable().
Timo Sirainen <tss@iki.fi>
parents:
9607
diff
changeset
|
78 buffer_get_modifiable_data((array)->arr.buffer, NULL)) + \ |
ada435a92e93
Added array_foreach() and array_foreach_modifiable().
Timo Sirainen <tss@iki.fi>
parents:
9607
diff
changeset
|
79 (array)->arr.buffer->used; \ |
18089
922ac3245e17
lib: array/hash - protect macro parameters
Phil Carmody <phil@dovecot.fi>
parents:
14921
diff
changeset
|
80 elem != elem ## _end; (elem)++) |
9996
ada435a92e93
Added array_foreach() and array_foreach_modifiable().
Timo Sirainen <tss@iki.fi>
parents:
9607
diff
changeset
|
81 #else |
ada435a92e93
Added array_foreach() and array_foreach_modifiable().
Timo Sirainen <tss@iki.fi>
parents:
9607
diff
changeset
|
82 # define array_foreach(array, elem) \ |
ada435a92e93
Added array_foreach() and array_foreach_modifiable().
Timo Sirainen <tss@iki.fi>
parents:
9607
diff
changeset
|
83 for (elem = *(array)->v; \ |
ada435a92e93
Added array_foreach() and array_foreach_modifiable().
Timo Sirainen <tss@iki.fi>
parents:
9607
diff
changeset
|
84 elem != CONST_PTR_OFFSET(*(array)->v, (array)->arr.buffer->used); \ |
ada435a92e93
Added array_foreach() and array_foreach_modifiable().
Timo Sirainen <tss@iki.fi>
parents:
9607
diff
changeset
|
85 (elem)++) |
ada435a92e93
Added array_foreach() and array_foreach_modifiable().
Timo Sirainen <tss@iki.fi>
parents:
9607
diff
changeset
|
86 # define array_foreach_modifiable(array, elem) \ |
ada435a92e93
Added array_foreach() and array_foreach_modifiable().
Timo Sirainen <tss@iki.fi>
parents:
9607
diff
changeset
|
87 for (elem = ARRAY_TYPE_CAST_MODIFIABLE(array) \ |
10248
1c089f4f3e48
array_foreach_modifiable() was broken in non-C99 compilers.
Timo Sirainen <tss@iki.fi>
parents:
10203
diff
changeset
|
88 buffer_get_modifiable_data((array)->arr.buffer, NULL); \ |
9996
ada435a92e93
Added array_foreach() and array_foreach_modifiable().
Timo Sirainen <tss@iki.fi>
parents:
9607
diff
changeset
|
89 elem != CONST_PTR_OFFSET(*(array)->v, (array)->arr.buffer->used); \ |
ada435a92e93
Added array_foreach() and array_foreach_modifiable().
Timo Sirainen <tss@iki.fi>
parents:
9607
diff
changeset
|
90 (elem)++) |
ada435a92e93
Added array_foreach() and array_foreach_modifiable().
Timo Sirainen <tss@iki.fi>
parents:
9607
diff
changeset
|
91 #endif |
ada435a92e93
Added array_foreach() and array_foreach_modifiable().
Timo Sirainen <tss@iki.fi>
parents:
9607
diff
changeset
|
92 |
18118
67b46a7f4ed2
lib: array - array_foreach_idx is just a generic ptr_to_idx helper
Phil Carmody <phil@dovecot.fi>
parents:
18117
diff
changeset
|
93 #define array_ptr_to_idx(array, elem) \ |
67b46a7f4ed2
lib: array - array_foreach_idx is just a generic ptr_to_idx helper
Phil Carmody <phil@dovecot.fi>
parents:
18117
diff
changeset
|
94 ((elem) - (array)->v[0]) |
10405 | 95 #define array_foreach_idx(array, elem) \ |
18118
67b46a7f4ed2
lib: array - array_foreach_idx is just a generic ptr_to_idx helper
Phil Carmody <phil@dovecot.fi>
parents:
18117
diff
changeset
|
96 array_ptr_to_idx(array, elem) |
10405 | 97 |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 static inline void |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
99 array_create_from_buffer_i(struct array *array, buffer_t *buffer, |
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
100 size_t element_size) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 { |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 array->buffer = buffer; |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 array->element_size = element_size; |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 } |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
105 #define array_create_from_buffer(array, buffer, element_size) \ |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
106 array_create_from_buffer_i(&(array)->arr, buffer, element_size) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 static inline void |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
109 array_create_i(struct array *array, pool_t pool, |
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
110 size_t element_size, unsigned int init_count) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 { |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 buffer_t *buffer; |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 buffer = buffer_create_dynamic(pool, init_count * element_size); |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
115 array_create_from_buffer_i(array, buffer, element_size); |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 } |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
117 #define array_create(array, pool, element_size, init_count) \ |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
118 array_create_i(&(array)->arr, pool, element_size, init_count) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 static inline void |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
121 array_free_i(struct array *array) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 { |
6414
a6a49d5efc59
Changed buffer_free() and buffer_free_without_data() APIs to take ** pointer
Timo Sirainen <tss@iki.fi>
parents:
6410
diff
changeset
|
123 buffer_free(&array->buffer); |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 } |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
125 #define array_free(array) \ |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
126 array_free_i(&(array)->arr) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
128 static inline bool |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
129 array_is_created_i(const struct array *array) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 { |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 return array->buffer != NULL; |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 } |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
133 #define array_is_created(array) \ |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
134 array_is_created_i(&(array)->arr) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 |
8610 | 136 static inline pool_t ATTR_PURE |
137 array_get_pool_i(struct array *array) | |
138 { | |
139 return buffer_get_pool(array->buffer); | |
140 } | |
141 #define array_get_pool(array) \ | |
142 array_get_pool_i(&(array)->arr) | |
143 | |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 static inline void |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
145 array_clear_i(struct array *array) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 { |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 buffer_set_used_size(array->buffer, 0); |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 } |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
149 #define array_clear(array) \ |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
150 array_clear_i(&(array)->arr) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 |
14526
2f776ca73cef
Code cleanup: Use array_count_i() to calculate array's size internally.
Timo Sirainen <tss@iki.fi>
parents:
10405
diff
changeset
|
152 static inline unsigned int ATTR_PURE |
2f776ca73cef
Code cleanup: Use array_count_i() to calculate array's size internally.
Timo Sirainen <tss@iki.fi>
parents:
10405
diff
changeset
|
153 array_count_i(const struct array *array) |
2f776ca73cef
Code cleanup: Use array_count_i() to calculate array's size internally.
Timo Sirainen <tss@iki.fi>
parents:
10405
diff
changeset
|
154 { |
2f776ca73cef
Code cleanup: Use array_count_i() to calculate array's size internally.
Timo Sirainen <tss@iki.fi>
parents:
10405
diff
changeset
|
155 return array->buffer->used / array->element_size; |
2f776ca73cef
Code cleanup: Use array_count_i() to calculate array's size internally.
Timo Sirainen <tss@iki.fi>
parents:
10405
diff
changeset
|
156 } |
2f776ca73cef
Code cleanup: Use array_count_i() to calculate array's size internally.
Timo Sirainen <tss@iki.fi>
parents:
10405
diff
changeset
|
157 #define array_count(array) \ |
2f776ca73cef
Code cleanup: Use array_count_i() to calculate array's size internally.
Timo Sirainen <tss@iki.fi>
parents:
10405
diff
changeset
|
158 array_count_i(&(array)->arr) |
18211
b0ac11ef7f51
lib: array - two helpers to avoid wasteful array_count
Phil Carmody <phil@dovecot.fi>
parents:
18200
diff
changeset
|
159 /* No need for the real count if all we're doing is comparing againts 0 */ |
b0ac11ef7f51
lib: array - two helpers to avoid wasteful array_count
Phil Carmody <phil@dovecot.fi>
parents:
18200
diff
changeset
|
160 #define array_is_empty(array) \ |
b0ac11ef7f51
lib: array - two helpers to avoid wasteful array_count
Phil Carmody <phil@dovecot.fi>
parents:
18200
diff
changeset
|
161 ((array)->arr.buffer->used == 0) |
b0ac11ef7f51
lib: array - two helpers to avoid wasteful array_count
Phil Carmody <phil@dovecot.fi>
parents:
18200
diff
changeset
|
162 #define array_not_empty(array) \ |
b0ac11ef7f51
lib: array - two helpers to avoid wasteful array_count
Phil Carmody <phil@dovecot.fi>
parents:
18200
diff
changeset
|
163 ((array)->arr.buffer->used > 0) |
14526
2f776ca73cef
Code cleanup: Use array_count_i() to calculate array's size internally.
Timo Sirainen <tss@iki.fi>
parents:
10405
diff
changeset
|
164 |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 static inline void |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
166 array_append_i(struct array *array, const void *data, unsigned int count) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 { |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 buffer_append(array->buffer, data, count * array->element_size); |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 } |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
170 |
5476
0c096f057e24
Use COMPILE_ERROR_IF_TYPES_NOT_COMPATIBLE() for validating the data type.
Timo Sirainen <tss@iki.fi>
parents:
5075
diff
changeset
|
171 #define array_append(array, data, count) \ |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
172 array_append_i(&(array)->arr + ARRAY_TYPE_CHECK(array, data), \ |
5476
0c096f057e24
Use COMPILE_ERROR_IF_TYPES_NOT_COMPATIBLE() for validating the data type.
Timo Sirainen <tss@iki.fi>
parents:
5075
diff
changeset
|
173 data, count) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 static inline void |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
176 array_append_array_i(struct array *dest_array, const struct array *src_array) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 { |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 i_assert(dest_array->element_size == src_array->element_size); |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 buffer_append_buf(dest_array->buffer, src_array->buffer, 0, (size_t)-1); |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 } |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
181 #define array_append_array(dest_array, src_array) \ |
18115
b7074256cc65
lib: array - additional compile-time checks to array_append
Phil Carmody <phil@dovecot.fi>
parents:
18111
diff
changeset
|
182 array_append_array_i(&(dest_array)->arr + ARRAY_TYPES_CHECK(dest_array, src_array), \ |
b7074256cc65
lib: array - additional compile-time checks to array_append
Phil Carmody <phil@dovecot.fi>
parents:
18111
diff
changeset
|
183 &(src_array)->arr) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 static inline void |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
186 array_insert_i(struct array *array, unsigned int idx, |
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
187 const void *data, unsigned int count) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 { |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 buffer_insert(array->buffer, idx * array->element_size, |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 data, count * array->element_size); |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
191 } |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
192 |
5476
0c096f057e24
Use COMPILE_ERROR_IF_TYPES_NOT_COMPATIBLE() for validating the data type.
Timo Sirainen <tss@iki.fi>
parents:
5075
diff
changeset
|
193 #define array_insert(array, idx, data, count) \ |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
194 array_insert_i(&(array)->arr + ARRAY_TYPE_CHECK(array, data), \ |
5476
0c096f057e24
Use COMPILE_ERROR_IF_TYPES_NOT_COMPATIBLE() for validating the data type.
Timo Sirainen <tss@iki.fi>
parents:
5075
diff
changeset
|
195 idx, data, count) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
197 static inline void |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
198 array_delete_i(struct array *array, unsigned int idx, unsigned int count) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 { |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 buffer_delete(array->buffer, idx * array->element_size, |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 count * array->element_size); |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
202 } |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
203 #define array_delete(array, idx, count) \ |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
204 array_delete_i(&(array)->arr, idx, count) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
205 |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 static inline const void * |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
207 array_get_i(const struct array *array, unsigned int *count_r) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
208 { |
14526
2f776ca73cef
Code cleanup: Use array_count_i() to calculate array's size internally.
Timo Sirainen <tss@iki.fi>
parents:
10405
diff
changeset
|
209 *count_r = array_count_i(array); |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
210 return array->buffer->data; |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
211 } |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
212 #define array_get(array, count) \ |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
213 ARRAY_TYPE_CAST_CONST(array)array_get_i(&(array)->arr, count) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
214 |
18117
8a4b536705ad
lib: test-array - remove possibility to optimise out tests
Phil Carmody <phil@dovecot.fi>
parents:
18115
diff
changeset
|
215 /* Re: i_assert() vs. pure: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51971#c1 */ |
7912
81806d402514
Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents:
7858
diff
changeset
|
216 static inline const void * ATTR_PURE |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
217 array_idx_i(const struct array *array, unsigned int idx) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
218 { |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
219 i_assert(idx * array->element_size < array->buffer->used); |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
220 return CONST_PTR_OFFSET(array->buffer->data, idx * array->element_size); |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
221 } |
5075
d0b50249e816
Removed disable-asserts-specific array_idx(). It didn't work if array's
Timo Sirainen <tss@iki.fi>
parents:
4807
diff
changeset
|
222 #define array_idx(array, idx) \ |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
223 ARRAY_TYPE_CAST_CONST(array)array_idx_i(&(array)->arr, idx) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
224 |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
225 static inline void * |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
226 array_get_modifiable_i(struct array *array, unsigned int *count_r) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
227 { |
14526
2f776ca73cef
Code cleanup: Use array_count_i() to calculate array's size internally.
Timo Sirainen <tss@iki.fi>
parents:
10405
diff
changeset
|
228 *count_r = array_count_i(array); |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
229 return buffer_get_modifiable_data(array->buffer, NULL); |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
230 } |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
231 #define array_get_modifiable(array, count) \ |
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
232 ARRAY_TYPE_CAST_MODIFIABLE(array) \ |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
233 array_get_modifiable_i(&(array)->arr, count) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
234 |
7857
63df79ccfedb
Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
7049
diff
changeset
|
235 void *array_idx_modifiable_i(struct array *array, unsigned int idx); |
4601
664011f3b1fb
Some more array changes. v and v_modifiable are now pointer-to-pointers so
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
236 #define array_idx_modifiable(array, idx) \ |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
237 ARRAY_TYPE_CAST_MODIFIABLE(array) \ |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
238 array_idx_modifiable_i(&(array)->arr, idx) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
239 |
7857
63df79ccfedb
Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
7049
diff
changeset
|
240 void array_idx_set_i(struct array *array, unsigned int idx, const void *data); |
5476
0c096f057e24
Use COMPILE_ERROR_IF_TYPES_NOT_COMPATIBLE() for validating the data type.
Timo Sirainen <tss@iki.fi>
parents:
5075
diff
changeset
|
241 #define array_idx_set(array, idx, data) \ |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
242 array_idx_set_i(&(array)->arr + ARRAY_TYPE_CHECK(array, data), \ |
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
243 idx, data) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
244 |
7857
63df79ccfedb
Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
7049
diff
changeset
|
245 void array_idx_clear_i(struct array *array, unsigned int idx); |
4452
66fc4c35a8de
Added array_idx_clear().
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4451
diff
changeset
|
246 #define array_idx_clear(array, idx) \ |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
247 array_idx_clear_i(&(array)->arr, idx) |
4452
66fc4c35a8de
Added array_idx_clear().
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4451
diff
changeset
|
248 |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
249 static inline void * |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
250 array_append_space_i(struct array *array) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
251 { |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
252 void *data; |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
253 |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
254 data = buffer_append_space_unsafe(array->buffer, array->element_size); |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
255 memset(data, 0, array->element_size); |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
256 return data; |
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
257 } |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
258 #define array_append_space(array) \ |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
259 ARRAY_TYPE_CAST_MODIFIABLE(array)array_append_space_i(&(array)->arr) |
14686
9ff19c1d5f69
Added array_append_zero() to write a zero-filled record to an array.
Timo Sirainen <tss@iki.fi>
parents:
14526
diff
changeset
|
260 #define array_append_zero(array) \ |
9ff19c1d5f69
Added array_append_zero() to write a zero-filled record to an array.
Timo Sirainen <tss@iki.fi>
parents:
14526
diff
changeset
|
261 (void)array_append_space_i(&(array)->arr) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
262 |
7857
63df79ccfedb
Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
7049
diff
changeset
|
263 void *array_insert_space_i(struct array *array, unsigned int idx); |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
264 #define array_insert_space(array, idx) \ |
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
265 ARRAY_TYPE_CAST_MODIFIABLE(array) \ |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
266 array_insert_space_i(&(array)->arr, idx) |
3190
ba17b6e45193
Added dynamic array implementation. When compiling with gcc and DEBUG
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
267 |
7049 | 268 static inline void |
269 array_copy(struct array *dest, unsigned int dest_idx, | |
270 const struct array *src, unsigned int src_idx, unsigned int count) | |
271 { | |
272 i_assert(dest->element_size == src->element_size); | |
273 | |
274 buffer_copy(dest->buffer, dest_idx * dest->element_size, | |
8141
5b845716308d
array_copy() was broken if source array was different from destination array.
Timo Sirainen <tss@iki.fi>
parents:
7912
diff
changeset
|
275 src->buffer, src_idx * src->element_size, |
7049 | 276 count * dest->element_size); |
277 } | |
278 | |
18200
7557234ac0f4
lib: array - helper to swap array buffer ownership
Phil Carmody <phil@dovecot.fi>
parents:
18134
diff
changeset
|
279 /* Exchange ownership of two arrays, which should have been allocated |
7557234ac0f4
lib: array - helper to swap array buffer ownership
Phil Carmody <phil@dovecot.fi>
parents:
18134
diff
changeset
|
280 from the same pool/context. Useful for updating an array with a |
18850
2ab0c5855548
lib: array - permit array_swap with uninitialised arrays
Phil Carmody <phil@dovecot.fi>
parents:
18211
diff
changeset
|
281 replacement. Can also do it with uninitialised arrays (which will |
2ab0c5855548
lib: array - permit array_swap with uninitialised arrays
Phil Carmody <phil@dovecot.fi>
parents:
18211
diff
changeset
|
282 have .element_size == 0). */ |
18200
7557234ac0f4
lib: array - helper to swap array buffer ownership
Phil Carmody <phil@dovecot.fi>
parents:
18134
diff
changeset
|
283 static inline void |
7557234ac0f4
lib: array - helper to swap array buffer ownership
Phil Carmody <phil@dovecot.fi>
parents:
18134
diff
changeset
|
284 array_swap_i(struct array *array1, struct array *array2) |
7557234ac0f4
lib: array - helper to swap array buffer ownership
Phil Carmody <phil@dovecot.fi>
parents:
18134
diff
changeset
|
285 { |
7557234ac0f4
lib: array - helper to swap array buffer ownership
Phil Carmody <phil@dovecot.fi>
parents:
18134
diff
changeset
|
286 buffer_t *buffer = array1->buffer; |
18850
2ab0c5855548
lib: array - permit array_swap with uninitialised arrays
Phil Carmody <phil@dovecot.fi>
parents:
18211
diff
changeset
|
287 size_t elsize = array1->element_size; |
18200
7557234ac0f4
lib: array - helper to swap array buffer ownership
Phil Carmody <phil@dovecot.fi>
parents:
18134
diff
changeset
|
288 |
7557234ac0f4
lib: array - helper to swap array buffer ownership
Phil Carmody <phil@dovecot.fi>
parents:
18134
diff
changeset
|
289 array1->buffer = array2->buffer; |
18850
2ab0c5855548
lib: array - permit array_swap with uninitialised arrays
Phil Carmody <phil@dovecot.fi>
parents:
18211
diff
changeset
|
290 array1->element_size = array2->element_size; |
18200
7557234ac0f4
lib: array - helper to swap array buffer ownership
Phil Carmody <phil@dovecot.fi>
parents:
18134
diff
changeset
|
291 array2->buffer = buffer; |
18850
2ab0c5855548
lib: array - permit array_swap with uninitialised arrays
Phil Carmody <phil@dovecot.fi>
parents:
18211
diff
changeset
|
292 array2->element_size = elsize; |
18200
7557234ac0f4
lib: array - helper to swap array buffer ownership
Phil Carmody <phil@dovecot.fi>
parents:
18134
diff
changeset
|
293 } |
7557234ac0f4
lib: array - helper to swap array buffer ownership
Phil Carmody <phil@dovecot.fi>
parents:
18134
diff
changeset
|
294 #define array_swap(array1, array2) \ |
7557234ac0f4
lib: array - helper to swap array buffer ownership
Phil Carmody <phil@dovecot.fi>
parents:
18134
diff
changeset
|
295 array_swap_i(&(array1)->arr + ARRAY_TYPES_CHECK(array1, array2), \ |
7557234ac0f4
lib: array - helper to swap array buffer ownership
Phil Carmody <phil@dovecot.fi>
parents:
18134
diff
changeset
|
296 &(array2)->arr) |
7557234ac0f4
lib: array - helper to swap array buffer ownership
Phil Carmody <phil@dovecot.fi>
parents:
18134
diff
changeset
|
297 |
7912
81806d402514
Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents:
7858
diff
changeset
|
298 bool array_cmp_i(const struct array *array1, |
81806d402514
Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents:
7858
diff
changeset
|
299 const struct array *array2) ATTR_PURE; |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
300 #define array_cmp(array1, array2) \ |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
301 array_cmp_i(&(array1)->arr, &(array2)->arr) |
3254
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3253
diff
changeset
|
302 |
18111
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
303 /* Test equality via a comparator */ |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
304 bool array_equal_fn_i(const struct array *array1, |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
305 const struct array *array2, |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
306 int (*cmp)(const void*, const void *)) ATTR_PURE; |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
307 #define array_equal_fn(array1, array2, cmp) \ |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
308 array_equal_fn_i(&(array1)->arr + \ |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
309 ARRAY_TYPES_CHECK(array1, array2), \ |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
310 &(array2)->arr + \ |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
311 CALLBACK_TYPECHECK(cmp, int (*)(typeof(*(array1)->v), \ |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
312 typeof(*(array2)->v))), \ |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
313 (int (*)(const void *, const void *))cmp) |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
314 bool array_equal_fn_ctx_i(const struct array *array1, |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
315 const struct array *array2, |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
316 int (*cmp)(const void*, const void *, const void *), |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
317 const void *context) ATTR_PURE; |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
318 /* Same, but with a context pointer. |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
319 context can't be void* as ``const typeof(context)'' won't compile, |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
320 so ``const typeof(*context)*'' is required instead, and that requires a |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
321 complete type. */ |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
322 #define array_equal_fn_ctx(array1, array2, cmp, ctx) \ |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
323 array_equal_fn_ctx_i(&(array1)->arr + \ |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
324 ARRAY_TYPES_CHECK(array1, array2), \ |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
325 &(array2)->arr + \ |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
326 CALLBACK_TYPECHECK(cmp, int (*)(typeof(*(array1)->v), \ |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
327 typeof(*(array2)->v), \ |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
328 const typeof(*ctx)*)), \ |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
329 (int (*)(const void *, const void *, const void *))cmp, \ |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
330 ctx) |
b8ac4e5a1002
lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents:
18090
diff
changeset
|
331 |
7912
81806d402514
Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents:
7858
diff
changeset
|
332 void array_reverse_i(struct array *array); |
7858 | 333 #define array_reverse(array) \ |
334 array_reverse_i(&(array)->arr) | |
335 | |
9490
a6e1f054a808
Added array_sort() for type-safe array sorting.
Timo Sirainen <tss@iki.fi>
parents:
8610
diff
changeset
|
336 void array_sort_i(struct array *array, int (*cmp)(const void *, const void *)); |
a6e1f054a808
Added array_sort() for type-safe array sorting.
Timo Sirainen <tss@iki.fi>
parents:
8610
diff
changeset
|
337 #define array_sort(array, cmp) \ |
14921
d3db2ba15d00
Removed CONTEXT_TYPE_SAFETY macro and reimplemented its functionality better.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
338 array_sort_i(&(array)->arr + \ |
d3db2ba15d00
Removed CONTEXT_TYPE_SAFETY macro and reimplemented its functionality better.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
339 CALLBACK_TYPECHECK(cmp, int (*)(typeof(*(array)->v), \ |
d3db2ba15d00
Removed CONTEXT_TYPE_SAFETY macro and reimplemented its functionality better.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
340 typeof(*(array)->v))), \ |
d3db2ba15d00
Removed CONTEXT_TYPE_SAFETY macro and reimplemented its functionality better.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
341 (int (*)(const void *, const void *))cmp) |
9490
a6e1f054a808
Added array_sort() for type-safe array sorting.
Timo Sirainen <tss@iki.fi>
parents:
8610
diff
changeset
|
342 |
9607
55690917fefb
Added type safe array_bsearch().
Timo Sirainen <tss@iki.fi>
parents:
9490
diff
changeset
|
343 void *array_bsearch_i(struct array *array, const void *key, |
55690917fefb
Added type safe array_bsearch().
Timo Sirainen <tss@iki.fi>
parents:
9490
diff
changeset
|
344 int (*cmp)(const void *, const void *)); |
55690917fefb
Added type safe array_bsearch().
Timo Sirainen <tss@iki.fi>
parents:
9490
diff
changeset
|
345 #define array_bsearch(array, key, cmp) \ |
14921
d3db2ba15d00
Removed CONTEXT_TYPE_SAFETY macro and reimplemented its functionality better.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
346 ARRAY_TYPE_CAST_MODIFIABLE(array)array_bsearch_i(&(array)->arr + \ |
d3db2ba15d00
Removed CONTEXT_TYPE_SAFETY macro and reimplemented its functionality better.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
347 CALLBACK_TYPECHECK(cmp, int (*)(typeof(const typeof(*key) *), \ |
d3db2ba15d00
Removed CONTEXT_TYPE_SAFETY macro and reimplemented its functionality better.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
348 typeof(*(array)->v))), \ |
d3db2ba15d00
Removed CONTEXT_TYPE_SAFETY macro and reimplemented its functionality better.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
349 (const void *)key, (int (*)(const void *, const void *))cmp) |
9607
55690917fefb
Added type safe array_bsearch().
Timo Sirainen <tss@iki.fi>
parents:
9490
diff
changeset
|
350 |
18132
1bbec03202e0
lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents:
18118
diff
changeset
|
351 /* Returns pointer to first element for which cmp(key,elem)==0, or NULL */ |
1bbec03202e0
lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents:
18118
diff
changeset
|
352 const void *array_lsearch_i(const struct array *array, const void *key, |
1bbec03202e0
lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents:
18118
diff
changeset
|
353 int (*cmp)(const void *, const void *)); |
1bbec03202e0
lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents:
18118
diff
changeset
|
354 static inline void *array_lsearch_modifiable_i(struct array *array, const void *key, |
1bbec03202e0
lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents:
18118
diff
changeset
|
355 int (*cmp)(const void *, const void *)) |
1bbec03202e0
lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents:
18118
diff
changeset
|
356 { |
1bbec03202e0
lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents:
18118
diff
changeset
|
357 return (void *)array_lsearch_i(array, key, cmp); |
1bbec03202e0
lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents:
18118
diff
changeset
|
358 } |
1bbec03202e0
lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents:
18118
diff
changeset
|
359 #define ARRAY_LSEARCH_CALL(modifiable, array, key, cmp) \ |
1bbec03202e0
lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents:
18118
diff
changeset
|
360 array_lsearch##modifiable##i( \ |
1bbec03202e0
lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents:
18118
diff
changeset
|
361 &(array)->arr + \ |
1bbec03202e0
lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents:
18118
diff
changeset
|
362 CALLBACK_TYPECHECK(cmp, int (*)(typeof(const typeof(*key) *), \ |
1bbec03202e0
lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents:
18118
diff
changeset
|
363 typeof(*(array)->v))), \ |
1bbec03202e0
lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents:
18118
diff
changeset
|
364 (const void *)key, \ |
1bbec03202e0
lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents:
18118
diff
changeset
|
365 (int (*)(const void *, const void *))cmp) |
1bbec03202e0
lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents:
18118
diff
changeset
|
366 #define array_lsearch(array, key, cmp) \ |
1bbec03202e0
lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents:
18118
diff
changeset
|
367 ARRAY_TYPE_CAST_CONST(array)ARRAY_LSEARCH_CALL(_, array, key, cmp) |
1bbec03202e0
lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents:
18118
diff
changeset
|
368 #define array_lsearch_modifiable(array, key, cmp) \ |
1bbec03202e0
lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents:
18118
diff
changeset
|
369 ARRAY_TYPE_CAST_MODIFIABLE(array)ARRAY_LSEARCH_CALL(_modifiable_, array, key, cmp) |
1bbec03202e0
lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents:
18118
diff
changeset
|
370 |
9607
55690917fefb
Added type safe array_bsearch().
Timo Sirainen <tss@iki.fi>
parents:
9490
diff
changeset
|
371 #endif |