Line data Source code
1 : // SPDX-License-Identifier: BSD-2-Clause 2 : // Copyright (C) 2013 Andrea Mazzoleni 3 : 4 : #include "tommyarrayblkof.h" 5 : 6 : /******************************************************************************/ 7 : /* array */ 8 : 9 318 : TOMMY_API void tommy_arrayblkof_init(tommy_arrayblkof* array, tommy_size_t element_size) 10 : { 11 318 : tommy_array_init(&array->block); 12 : 13 318 : array->element_size = element_size; 14 318 : array->count = 0; 15 318 : } 16 : 17 293 : TOMMY_API void tommy_arrayblkof_done(tommy_arrayblkof* array) 18 : { 19 : tommy_size_t i; 20 : 21 866 : for (i = 0; i < tommy_array_size(&array->block); ++i) 22 573 : tommy_free(tommy_array_get(&array->block, i)); 23 : 24 293 : tommy_array_done(&array->block); 25 293 : } 26 : 27 1851430 : TOMMY_API void tommy_arrayblkof_grow(tommy_arrayblkof* array, tommy_size_t count) 28 : { 29 : tommy_size_t block_max; 30 : tommy_size_t block_mac; 31 : 32 1851430 : if (array->count >= count) 33 140594 : return; 34 1710836 : array->count = count; 35 : 36 1710836 : block_max = (count + TOMMY_ARRAYBLKOF_SIZE - 1) / TOMMY_ARRAYBLKOF_SIZE; 37 1710836 : block_mac = tommy_array_size(&array->block); 38 : 39 1710836 : if (block_mac < block_max) { 40 : /* grow the block array */ 41 615 : tommy_array_grow(&array->block, block_max); 42 : 43 : /* allocate new blocks */ 44 1230 : while (block_mac < block_max) { 45 615 : void** ptr = tommy_cast(void**, tommy_calloc(TOMMY_ARRAYBLKOF_SIZE, array->element_size)); 46 : 47 : /* set the new block */ 48 615 : tommy_array_set(&array->block, block_mac, ptr); 49 : 50 615 : ++block_mac; 51 : } 52 : } 53 : } 54 : 55 1 : TOMMY_API tommy_size_t tommy_arrayblkof_memory_usage(tommy_arrayblkof* array) 56 : { 57 1 : return tommy_array_memory_usage(&array->block) + tommy_array_size(&array->block) * TOMMY_ARRAYBLKOF_SIZE * array->element_size; 58 : } 59 :