Blender  V3.3
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 
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