一時バッファにbit単位でフラグを格納するようにして一時バッファの確保するサイズを小さくした。
@@ -243,8 +243,9 @@ | ||
243 | 243 | {\ |
244 | 244 | CstlIterInternal i;\ |
245 | 245 | register size_t j = 0;\ |
246 | + register size_t idx = 0;\ | |
246 | 247 | size_t n;\ |
247 | - char *insert_flags;\ | |
248 | + unsigned char *insert_flags;\ | |
248 | 249 | CSTL_ASSERT(self && "Set_assoc_insert_range");\ |
249 | 250 | CSTL_ASSERT(self->magic == self && "Set_assoc_insert_range");\ |
250 | 251 | CSTL_ASSERT(CSTL_CAST_VPTR(Name, first.in_vptr) == CSTL_CAST_VPTR(Name, last.in_vptr) && "Set_assoc_insert_range");\ |
@@ -257,19 +258,30 @@ | ||
257 | 258 | n++;\ |
258 | 259 | }\ |
259 | 260 | }\ |
260 | - insert_flags = (char *) malloc(n * sizeof(char));\ | |
261 | + if (!n) return 1;\ | |
262 | + insert_flags = (unsigned char *) malloc(((n - 1) / 8) + 1);\ | |
261 | 263 | if (!insert_flags) return 0;\ |
262 | 264 | for (i = first; CSTL_CAST_VPTR(Name, i.in_vptr)->ne(i.data, last.data); \ |
263 | 265 | CSTL_CAST_VPTR(Name, i.in_vptr)->inc(&i.data), j++) {\ |
264 | 266 | int success;\ |
265 | 267 | if (Name##_set_insert(self, *CSTL_CAST_VPTR(Name, i.in_vptr)->data(i.data), 0, &success)) {\ |
266 | - insert_flags[j] = (success != 0);\ | |
268 | + if (success) {\ | |
269 | + insert_flags[idx] |= (unsigned char)(1 << (j % 8));\ | |
270 | + } else {\ | |
271 | + insert_flags[idx] &= ~(unsigned char)(1 << (j % 8));\ | |
272 | + }\ | |
273 | + if ((j % 8) == 7) {\ | |
274 | + idx++;\ | |
275 | + }\ | |
267 | 276 | } else {\ |
268 | 277 | register size_t k;\ |
269 | - for (i = first, k = 0; k < j; CSTL_CAST_VPTR(Name, i.in_vptr)->inc(&i.data), k++) {\ | |
270 | - if (insert_flags[k]) {\ | |
278 | + for (i = first, k = 0, idx = 0; k < j; CSTL_CAST_VPTR(Name, i.in_vptr)->inc(&i.data), k++) {\ | |
279 | + if (insert_flags[idx] & (unsigned char)(1 << (k % 8))) {\ | |
271 | 280 | Name##_erase_key(self, *CSTL_CAST_VPTR(Name, i.in_vptr)->data(i.data));\ |
272 | 281 | }\ |
282 | + if ((k % 8) == 7) {\ | |
283 | + idx++;\ | |
284 | + }\ | |
273 | 285 | }\ |
274 | 286 | free(insert_flags);\ |
275 | 287 | return 0;\ |
@@ -282,8 +282,9 @@ | ||
282 | 282 | {\ |
283 | 283 | CstlIterInternal i;\ |
284 | 284 | register size_t j = 0;\ |
285 | + register size_t idx = 0;\ | |
285 | 286 | size_t n;\ |
286 | - char *insert_flags;\ | |
287 | + unsigned char *insert_flags;\ | |
287 | 288 | CSTL_ASSERT(self && "Map_assoc_insert_range");\ |
288 | 289 | CSTL_ASSERT(self->magic == self && "Map_assoc_insert_range");\ |
289 | 290 | CSTL_ASSERT(CSTL_CAST_VPTR(Name, first.in_vptr) == CSTL_CAST_VPTR(Name, last.in_vptr) && "Map_assoc_insert_range");\ |
@@ -293,7 +294,8 @@ | ||
293 | 294 | CSTL_CAST_VPTR(Name, i.in_vptr)->inc(&i.data)) {\ |
294 | 295 | n++;\ |
295 | 296 | }\ |
296 | - insert_flags = (char *) malloc(n * sizeof(char));\ | |
297 | + if (!n) return 1;\ | |
298 | + insert_flags = (unsigned char *) malloc(((n - 1) / 8) + 1);\ | |
297 | 299 | if (!insert_flags) return 0;\ |
298 | 300 | for (i = first; CSTL_CAST_VPTR(Name, i.in_vptr)->ne(i.data, last.data); \ |
299 | 301 | CSTL_CAST_VPTR(Name, i.in_vptr)->inc(&i.data), j++) {\ |
@@ -300,13 +302,23 @@ | ||
300 | 302 | int success;\ |
301 | 303 | if (Name##_map_insert_ref(self, *CSTL_CAST_VPTR(Name, i.in_vptr)->key(i.data), \ |
302 | 304 | CSTL_CAST_VPTR(Name, i.in_vptr)->val(i.data), 0, &success)) {\ |
303 | - insert_flags[j] = (success != 0);\ | |
305 | + if (success) {\ | |
306 | + insert_flags[idx] |= (unsigned char)(1 << (j % 8));\ | |
307 | + } else {\ | |
308 | + insert_flags[idx] &= ~(unsigned char)(1 << (j % 8));\ | |
309 | + }\ | |
310 | + if ((j % 8) == 7) {\ | |
311 | + idx++;\ | |
312 | + }\ | |
304 | 313 | } else {\ |
305 | 314 | register size_t k;\ |
306 | - for (i = first, k = 0; k < j; CSTL_CAST_VPTR(Name, i.in_vptr)->inc(&i.data), k++) {\ | |
307 | - if (insert_flags[k]) {\ | |
315 | + for (i = first, k = 0, idx = 0; k < j; CSTL_CAST_VPTR(Name, i.in_vptr)->inc(&i.data), k++) {\ | |
316 | + if (insert_flags[idx] & (unsigned char)(1 << (k % 8))) {\ | |
308 | 317 | Name##_erase_key(self, *CSTL_CAST_VPTR(Name, i.in_vptr)->key(i.data));\ |
309 | 318 | }\ |
319 | + if ((k % 8) == 7) {\ | |
320 | + idx++;\ | |
321 | + }\ | |
310 | 322 | }\ |
311 | 323 | free(insert_flags);\ |
312 | 324 | return 0;\ |
@@ -53,7 +53,7 @@ | ||
53 | 53 | #define CSTL_MAGIC(x) |
54 | 54 | #define CSTL_ASSERT(x) ((void) 0) |
55 | 55 | #endif |
56 | -#define CSTL_ASSERT_SELF(s) (CSTL_ASSERT(s), CSTL_ASSERT((s)->magic == (s))) | |
56 | +#define CSTL_ASSERT_SELF(s) CSTL_ASSERT(s), CSTL_ASSERT((s)->magic == (s)) | |
57 | 57 | |
58 | 58 | #define CSTL_UNUSED_PARAM(x) (void) x |
59 | 59 |