Line data Source code
1 : /* 2 : * Copyright (c) 2013, Andrea Mazzoleni. All rights reserved. 3 : * 4 : * Redistribution and use in source and binary forms, with or without 5 : * modification, are permitted provided that the following conditions 6 : * are met: 7 : * 8 : * 1. Redistributions of source code must retain the above copyright 9 : * notice, this list of conditions and the following disclaimer. 10 : * 11 : * 2. Redistributions in binary form must reproduce the above copyright 12 : * notice, this list of conditions and the following disclaimer in the 13 : * documentation and/or other materials provided with the distribution. 14 : * 15 : * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16 : * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 : * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 19 : * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20 : * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21 : * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22 : * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23 : * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24 : * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25 : * POSSIBILITY OF SUCH DAMAGE. 26 : */ 27 : 28 : /** \file 29 : * Dynamic array based on blocks of fixed size. 30 : * 31 : * This array is able to grow dynamically upon request, without any reallocation. 32 : * 33 : * This is very similar at ::tommy_arrayblk, but it allows to store elements of any 34 : * size and not just pointers. 35 : * 36 : * Note that in this case tommy_arrayblkof_ref() returns a pointer to the element, 37 : * that should be used for getting and setting elements in the array, 38 : * as generic getter and setter are not available. 39 : */ 40 : 41 : #ifndef __TOMMYARRAYBLKOF_H 42 : #define __TOMMYARRAYBLKOF_H 43 : 44 : #include "tommytypes.h" 45 : #include "tommyarray.h" 46 : 47 : #include <assert.h> /* for assert */ 48 : 49 : /******************************************************************************/ 50 : /* array */ 51 : 52 : /** 53 : * Elements for each block. 54 : */ 55 : #define TOMMY_ARRAYBLKOF_SIZE (4 * 1024) 56 : 57 : /** 58 : * Array container type. 59 : * \note Don't use internal fields directly, but access the container only using functions. 60 : */ 61 : typedef struct tommy_arrayblkof_struct { 62 : tommy_array block; /**< Array of blocks. */ 63 : tommy_size_t element_size; /**< Size of the stored element in bytes. */ 64 : tommy_size_t count; /**< Number of initialized elements in the array. */ 65 : } tommy_arrayblkof; 66 : 67 : /** 68 : * Initializes the array. 69 : * \param element_size Size in byte of the element to store in the array. 70 : */ 71 : void tommy_arrayblkof_init(tommy_arrayblkof* array, tommy_size_t element_size); 72 : 73 : /** 74 : * Deinitializes the array. 75 : */ 76 : void tommy_arrayblkof_done(tommy_arrayblkof* array); 77 : 78 : /** 79 : * Grows the size up to the specified value. 80 : * All the new elements in the array are initialized with the 0 value. 81 : */ 82 : void tommy_arrayblkof_grow(tommy_arrayblkof* array, tommy_size_t size); 83 : 84 : /** 85 : * Gets a reference of the element at the specified position. 86 : * You must be sure that space for this position is already 87 : * allocated calling tommy_arrayblkof_grow(). 88 : */ 89 4561993 : tommy_inline void* tommy_arrayblkof_ref(tommy_arrayblkof* array, tommy_size_t pos) 90 : { 91 : unsigned char* base; 92 : 93 4561993 : assert(pos < array->count); 94 : 95 4561993 : base = tommy_cast(unsigned char*, tommy_array_get(&array->block, pos / TOMMY_ARRAYBLKOF_SIZE)); 96 : 97 4561993 : return base + (pos % TOMMY_ARRAYBLKOF_SIZE) * array->element_size; 98 : } 99 : 100 : /** 101 : * Gets the initialized size of the array. 102 : */ 103 3127326 : tommy_inline tommy_size_t tommy_arrayblkof_size(tommy_arrayblkof* array) 104 : { 105 3127326 : return array->count; 106 : } 107 : 108 : /** 109 : * Gets the size of allocated memory. 110 : */ 111 : tommy_size_t tommy_arrayblkof_memory_usage(tommy_arrayblkof* array); 112 : 113 : #endif 114 :