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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
ef3e7ba494bc Removed extra ';'
Timo Sirainen <tss@iki.fi>
parents: 4602
diff changeset
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
cc4e9d1fef7e Added array_foreach_idx()
Timo Sirainen <tss@iki.fi>
parents: 10326
diff changeset
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
cc4e9d1fef7e Added array_foreach_idx()
Timo Sirainen <tss@iki.fi>
parents: 10326
diff changeset
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
9f98a74e0757 Added array_get_pool().
Timo Sirainen <tss@iki.fi>
parents: 8141
diff changeset
136 static inline pool_t ATTR_PURE
9f98a74e0757 Added array_get_pool().
Timo Sirainen <tss@iki.fi>
parents: 8141
diff changeset
137 array_get_pool_i(struct array *array)
9f98a74e0757 Added array_get_pool().
Timo Sirainen <tss@iki.fi>
parents: 8141
diff changeset
138 {
9f98a74e0757 Added array_get_pool().
Timo Sirainen <tss@iki.fi>
parents: 8141
diff changeset
139 return buffer_get_pool(array->buffer);
9f98a74e0757 Added array_get_pool().
Timo Sirainen <tss@iki.fi>
parents: 8141
diff changeset
140 }
9f98a74e0757 Added array_get_pool().
Timo Sirainen <tss@iki.fi>
parents: 8141
diff changeset
141 #define array_get_pool(array) \
9f98a74e0757 Added array_get_pool().
Timo Sirainen <tss@iki.fi>
parents: 8141
diff changeset
142 array_get_pool_i(&(array)->arr)
9f98a74e0757 Added array_get_pool().
Timo Sirainen <tss@iki.fi>
parents: 8141
diff changeset
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
bbeee3db9967 Added queue implementation.
Timo Sirainen <tss@iki.fi>
parents: 6416
diff changeset
268 static inline void
bbeee3db9967 Added queue implementation.
Timo Sirainen <tss@iki.fi>
parents: 6416
diff changeset
269 array_copy(struct array *dest, unsigned int dest_idx,
bbeee3db9967 Added queue implementation.
Timo Sirainen <tss@iki.fi>
parents: 6416
diff changeset
270 const struct array *src, unsigned int src_idx, unsigned int count)
bbeee3db9967 Added queue implementation.
Timo Sirainen <tss@iki.fi>
parents: 6416
diff changeset
271 {
bbeee3db9967 Added queue implementation.
Timo Sirainen <tss@iki.fi>
parents: 6416
diff changeset
272 i_assert(dest->element_size == src->element_size);
bbeee3db9967 Added queue implementation.
Timo Sirainen <tss@iki.fi>
parents: 6416
diff changeset
273
bbeee3db9967 Added queue implementation.
Timo Sirainen <tss@iki.fi>
parents: 6416
diff changeset
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
bbeee3db9967 Added queue implementation.
Timo Sirainen <tss@iki.fi>
parents: 6416
diff changeset
276 count * dest->element_size);
bbeee3db9967 Added queue implementation.
Timo Sirainen <tss@iki.fi>
parents: 6416
diff changeset
277 }
bbeee3db9967 Added queue implementation.
Timo Sirainen <tss@iki.fi>
parents: 6416
diff changeset
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
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
333 #define array_reverse(array) \
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
334 array_reverse_i(&(array)->arr)
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
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