Blender
V3.3
source
blender
blenlib
BLI_array.h
Go to the documentation of this file.
1
/* SPDX-License-Identifier: GPL-2.0-or-later
2
* Copyright 2008 Blender Foundation. All rights reserved. */
3
4
#pragma once
5
11
/* -------------------------------------------------------------------- */
16
#define _bli_array_totalsize_dynamic(arr) \
17
(((arr) == NULL) ? 0 : MEM_allocN_len(arr) / sizeof(*(arr)))
18
19
#define _bli_array_totalsize_static(arr) (sizeof(_##arr##_static) / sizeof(*(arr)))
20
21
#define _bli_array_totalsize(arr) \
22
((size_t)(((void *)(arr) == (void *)_##arr##_static && (void *)(arr) != NULL) ? \
23
_bli_array_totalsize_static(arr) : \
24
_bli_array_totalsize_dynamic(arr)))
25
38
void
_bli_array_grow_func
(
void
**arr_p,
39
const
void
*arr_static,
40
int
sizeof_arr_p,
41
int
arr_len,
42
int
num,
43
const
char
*alloc_str);
44
45
/* -------------------------------------------------------------------- */
50
#define BLI_array_declare(arr) \
51
int _##arr##_len = ((void)(sizeof(*(arr))), 0); \
52
void *_##arr##_static = NULL
53
58
#define BLI_array_staticdeclare(arr, maxstatic) \
59
int _##arr##_len = 0; \
60
char _##arr##_static[maxstatic * sizeof(*(arr))]
61
63
#define BLI_array_len(arr) ((void)0, _##arr##_len)
64
71
#define BLI_array_reserve(arr, num) \
72
(void)((((void *)(arr) == NULL) && \
73
((void *)(_##arr##_static) != \
74
NULL) &&
/* don't add _##arr##_len below because it must be zero */
\
75
(_bli_array_totalsize_static(arr) >= \
76
(size_t)(_##arr##_len + \
77
(num)))) ?
/* we have an empty array and a static var big enough */
\
78
(void)(arr = (void *)_##arr##_static) :
/* use existing static array or allocate */
\
79
(LIKELY(_bli_array_totalsize(arr) >= (size_t)(_##arr##_len + (num))) ? \
80
(void)0
/* do nothing */
: \
81
_bli_array_grow_func((void **)&(arr), \
82
_##arr##_static, \
83
sizeof(*(arr)), \
84
_##arr##_len, \
85
num, \
86
"BLI_array."
#arr)))
87
91
#define BLI_array_grow_items(arr, num) (BLI_array_reserve(arr, num), (_##arr##_len += num))
92
93
#define BLI_array_grow_one(arr) BLI_array_grow_items(arr, 1)
94
98
#define BLI_array_append(arr, item) \
99
((void)BLI_array_grow_one(arr), (void)(arr[_##arr##_len - 1] = item))
100
105
#define BLI_array_append_r(arr, item) \
106
((void)BLI_array_grow_one(arr), (void)(arr[_##arr##_len - 1] = item), (&arr[_##arr##_len - 1]))
107
111
#define BLI_array_append_ret(arr) (BLI_array_reserve(arr, 1), &arr[(_##arr##_len++)])
112
113
#define BLI_array_free(arr) \
114
{ \
115
if (arr && (char *)arr != _##arr##_static) { \
116
BLI_array_fake_user(arr); \
117
MEM_freeN((void *)arr); \
118
} \
119
} \
120
((void)0)
121
122
#define BLI_array_pop(arr) ((arr && _##arr##_len) ? arr[--_##arr##_len] : NULL)
123
128
#define BLI_array_clear(arr) \
129
{ \
130
_##arr##_len = 0; \
131
} \
132
((void)0)
133
138
#define BLI_array_len_set(arr, len) \
139
{ \
140
_##arr##_len = (len); \
141
} \
142
((void)0)
143
147
#define BLI_array_fake_user(arr) ((void)_##arr##_len, (void)_##arr##_static)
148
152
#define BLI_array_trim(arr) \
153
{ \
154
if (_bli_array_totalsize_dynamic(arr) != _##arr##_len) { \
155
arr = MEM_reallocN(arr, sizeof(*arr) * _##arr##_len); \
156
} \
157
} \
158
((void)0)
159
162
/* -------------------------------------------------------------------- */
172
#define BLI_array_fixedstack_declare(arr, maxstatic, realsize, allocstr) \
173
char _##arr##_static[maxstatic * sizeof(*(arr))]; \
174
const bool _##arr##_is_static = ((void *)_##arr##_static) != \
175
(arr = ((realsize) <= maxstatic) ? \
176
(void *)_##arr##_static : \
177
MEM_mallocN(sizeof(*(arr)) * (realsize), allocstr))
178
179
#define BLI_array_fixedstack_free(arr) \
180
if (_##arr##_is_static) { \
181
MEM_freeN(arr); \
182
} \
183
((void)0)
184
_bli_array_grow_func
void _bli_array_grow_func(void **arr_p, const void *arr_static, int sizeof_arr_p, int arr_len, int num, const char *alloc_str)
Definition:
BLI_array.c:41
Generated on Sat Jul 27 2024 14:57:55 for Blender by
doxygen
1.9.1