Blender V4.3
BLI_memiter_test.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#include "testing/testing.h"
6
7#include "MEM_guardedalloc.h"
8
9#include "BLI_array_utils.h"
10#include "BLI_memiter.h"
11#include "BLI_string_utils.hh"
12
14#include "BLI_string.h"
15
16TEST(memiter, Nop)
17{
20}
21
22static void memiter_empty_test(int elems_num, const int chunk_size)
23{
24 BLI_memiter *mi = BLI_memiter_create(chunk_size);
25 void *data;
26 for (int index = 0; index < elems_num; index++) {
27 data = BLI_memiter_alloc(mi, 0);
28 }
29 int index = 0, total_size = 0;
31 BLI_memiter_iter_init(mi, &it);
32 uint elem_size;
33 while ((data = BLI_memiter_iter_step_size(&it, &elem_size))) {
34 index += 1;
35 total_size += elem_size;
36 }
37 EXPECT_EQ(0, total_size);
38 EXPECT_EQ(elems_num, index);
39
41}
42
43#define MEMITER_NUMBER_TEST_FN(fn, number_type) \
44 static void fn(int elems_num, const int chunk_size) \
45 { \
46 BLI_memiter *mi = BLI_memiter_create(chunk_size); \
47 number_type *data; \
48 for (int index = 0; index < elems_num; index++) { \
49 data = (number_type *)BLI_memiter_alloc(mi, sizeof(number_type)); \
50 *data = index; \
51 } \
52 BLI_memiter_handle it; \
53 BLI_memiter_iter_init(mi, &it); \
54 uint elem_size; \
55 int index = 0; \
56 while ((data = (number_type *)BLI_memiter_iter_step_size(&it, &elem_size))) { \
57 EXPECT_EQ(sizeof(number_type), elem_size); \
58 EXPECT_EQ(index, *data); \
59 index += 1; \
60 } \
61 BLI_memiter_destroy(mi); \
62 }
63
64/* generate number functions */
65MEMITER_NUMBER_TEST_FN(memiter_char_test, char)
66MEMITER_NUMBER_TEST_FN(memiter_short_test, short)
67MEMITER_NUMBER_TEST_FN(memiter_int_test, int)
68MEMITER_NUMBER_TEST_FN(memiter_long_test, int64_t)
69
70static void memiter_string_test(const char *strings[], const int chunk_size)
71{
72 BLI_memiter *mi = BLI_memiter_create(chunk_size);
73 char *data;
74 int index = 0;
75 int total_size_expect = 0;
76 while (strings[index]) {
77 const int size = strlen(strings[index]) + 1;
78 BLI_memiter_alloc_from(mi, size, strings[index]);
79 total_size_expect += size;
80 index += 1;
81 }
82 const int strings_len = index;
83 int total_size = 0;
85 BLI_memiter_iter_init(mi, &it);
86 uint elem_size;
87 index = 0;
88 while ((data = (char *)BLI_memiter_iter_step_size(&it, &elem_size))) {
89 EXPECT_EQ(strlen(strings[index]) + 1, elem_size);
90 EXPECT_STREQ(strings[index], data);
91 total_size += elem_size;
92 index += 1;
93 }
94 EXPECT_EQ(total_size_expect, total_size);
95 EXPECT_EQ(strings_len, index);
96
98}
99
100static void memiter_words10k_test(const char split_char, const int chunk_size)
101{
102 const int words_len = sizeof(words10k) - 1;
103 char *words = BLI_strdupn(words10k, words_len);
104 BLI_string_replace_char(words, split_char, '\0');
105
106 BLI_memiter *mi = BLI_memiter_create(chunk_size);
107
108 char *data;
109 int index;
110 char *c_end, *c;
111 c_end = words + words_len;
112 c = words;
113 index = 0;
114 while (c < c_end) {
115 int elem_size = strlen(c) + 1;
116 data = (char *)BLI_memiter_alloc(mi, elem_size);
117 memcpy(data, c, elem_size);
118 c += elem_size;
119 index += 1;
120 }
121 const int len_expect = index;
122 c = words;
123 uint size;
125 BLI_memiter_iter_init(mi, &it);
126 index = 0;
127 while ((data = (char *)BLI_memiter_iter_step_size(&it, &size))) {
128 int size_expect = strlen(c) + 1;
129 EXPECT_EQ(size_expect, size);
130 EXPECT_STREQ(c, data);
131 c += size;
132 index += 1;
133 }
134 EXPECT_EQ(len_expect, index);
136 MEM_freeN(words);
137}
138
139#define TEST_EMPTY_AT_CHUNK_SIZE(chunk_size) \
140 TEST(memiter, Empty0_##chunk_size) \
141 { \
142 memiter_empty_test(0, chunk_size); \
143 } \
144 TEST(memiter, Empty1_##chunk_size) \
145 { \
146 memiter_empty_test(1, chunk_size); \
147 } \
148 TEST(memiter, Empty2_##chunk_size) \
149 { \
150 memiter_empty_test(2, chunk_size); \
151 } \
152 TEST(memiter, Empty3_##chunk_size) \
153 { \
154 memiter_empty_test(3, chunk_size); \
155 } \
156 TEST(memiter, Empty13_##chunk_size) \
157 { \
158 memiter_empty_test(13, chunk_size); \
159 } \
160 TEST(memiter, Empty256_##chunk_size) \
161 { \
162 memiter_empty_test(256, chunk_size); \
163 }
164
170
171#define TEST_NUMBER_AT_CHUNK_SIZE(chunk_size) \
172 TEST(memiter, Char1_##chunk_size) \
173 { \
174 memiter_char_test(1, chunk_size); \
175 } \
176 TEST(memiter, Short1_##chunk_size) \
177 { \
178 memiter_short_test(1, chunk_size); \
179 } \
180 TEST(memiter, Int1_##chunk_size) \
181 { \
182 memiter_int_test(1, chunk_size); \
183 } \
184 TEST(memiter, Long1_##chunk_size) \
185 { \
186 memiter_long_test(1, chunk_size); \
187 } \
188\
189 TEST(memiter, Char2_##chunk_size) \
190 { \
191 memiter_char_test(2, chunk_size); \
192 } \
193 TEST(memiter, Short2_##chunk_size) \
194 { \
195 memiter_short_test(2, chunk_size); \
196 } \
197 TEST(memiter, Int2_##chunk_size) \
198 { \
199 memiter_int_test(2, chunk_size); \
200 } \
201 TEST(memiter, Long2_##chunk_size) \
202 { \
203 memiter_long_test(2, chunk_size); \
204 } \
205\
206 TEST(memiter, Char3_##chunk_size) \
207 { \
208 memiter_char_test(3, chunk_size); \
209 } \
210 TEST(memiter, Short3_##chunk_size) \
211 { \
212 memiter_short_test(3, chunk_size); \
213 } \
214 TEST(memiter, Int3_##chunk_size) \
215 { \
216 memiter_int_test(3, chunk_size); \
217 } \
218 TEST(memiter, Long3_##chunk_size) \
219 { \
220 memiter_long_test(3, chunk_size); \
221 } \
222\
223 TEST(memiter, Char256_##chunk_size) \
224 { \
225 memiter_char_test(256, chunk_size); \
226 } \
227 TEST(memiter, Short256_##chunk_size) \
228 { \
229 memiter_short_test(256, chunk_size); \
230 } \
231 TEST(memiter, Int256_##chunk_size) \
232 { \
233 memiter_int_test(256, chunk_size); \
234 } \
235 TEST(memiter, Long256_##chunk_size) \
236 { \
237 memiter_long_test(256, chunk_size); \
238 }
239
245
246#define STRINGS_TEST(chunk_size, ...) \
247 { \
248 const char *data[] = {__VA_ARGS__, nullptr}; \
249 memiter_string_test(data, chunk_size); \
250 }
251
252#define TEST_STRINGS_AT_CHUNK_SIZE(chunk_size) \
253 TEST(memiter, Strings_##chunk_size) \
254 { \
255 STRINGS_TEST(chunk_size, ""); \
256 STRINGS_TEST(chunk_size, "test", "me"); \
257 STRINGS_TEST(chunk_size, "more", "test", "data", "to", "follow"); \
258 }
259
265
266#define TEST_WORDS10K_AT_CHUNK_SIZE(chunk_size) \
267 TEST(memiter, Words10kSentence_##chunk_size) \
268 { \
269 memiter_words10k_test('.', chunk_size); \
270 } \
271 TEST(memiter, Words10kWords_##chunk_size) \
272 { \
273 memiter_words10k_test(' ', chunk_size); \
274 }
275
Generic array manipulation API.
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
void BLI_memiter_destroy(BLI_memiter *mi) ATTR_NONNULL(1)
void BLI_memiter_alloc_from(BLI_memiter *mi, uint elem_size, const void *data_from) ATTR_NONNULL(1
BLI_memiter * BLI_memiter_create(unsigned int chunk_size_min) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL
void * BLI_memiter_alloc(BLI_memiter *mi, unsigned int elem_size) ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL ATTR_NONNULL(1)
void BLI_memiter_iter_init(BLI_memiter *mi, BLI_memiter_handle *iter) ATTR_NONNULL(1
void * BLI_memiter_iter_step_size(BLI_memiter_handle *iter, uint *r_size) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
static void memiter_words10k_test(const char split_char, const int chunk_size)
#define TEST_WORDS10K_AT_CHUNK_SIZE(chunk_size)
#define TEST_NUMBER_AT_CHUNK_SIZE(chunk_size)
TEST(memiter, Nop)
#define TEST_EMPTY_AT_CHUNK_SIZE(chunk_size)
#define TEST_STRINGS_AT_CHUNK_SIZE(chunk_size)
static void memiter_string_test(const char *strings[], const int chunk_size)
#define MEMITER_NUMBER_TEST_FN(fn, number_type)
static void memiter_empty_test(int elems_num, const int chunk_size)
const char words10k[]
char * BLI_strdupn(const char *str, size_t len) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition string.c:29
void BLI_string_replace_char(char *str, char src, char dst) ATTR_NONNULL(1)
unsigned int uint
Read Guarded memory(de)allocation.
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
void MEM_freeN(void *vmemh)
Definition mallocn.cc:105
__int64 int64_t
Definition stdint.h:89