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 150000000 : tommy_inline void* tommy_arrayblkof_ref(tommy_arrayblkof* array, tommy_size_t pos)
90 : {
91 : unsigned char* base;
92 :
93 150000000 : assert(pos < array->count);
94 :
95 150000000 : base = tommy_cast(unsigned char*, tommy_array_get(&array->block, pos / TOMMY_ARRAYBLKOF_SIZE));
96 :
97 150000000 : return base + (pos % TOMMY_ARRAYBLKOF_SIZE) * array->element_size;
98 : }
99 :
100 : /**
101 : * Gets the initialized size of the array.
102 : */
103 : tommy_inline tommy_size_t tommy_arrayblkof_size(tommy_arrayblkof* array)
104 : {
105 : 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 :
|