d16dd36763da2391b914270391070090145a5ac2
[blender.git] / source / blender / blenlib / intern / BLI_array.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2008 Blender Foundation.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): Joseph Eagar,
24  *                 Campbell Barton
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28
29 /** \file blender/blenlib/intern/BLI_array.c
30  *  \ingroup bli
31  *  \brief A (mainly) macro array library.
32  *
33  * This is an array library, used to manage array (re)allocation.
34  *
35  * \note This is primarily accessed via macros,
36  * functions are used to implement some of the internals.
37  *
38  * Example usage:
39  *
40  * \code{.c}
41  * int *arr = NULL;
42  * BLI_array_declare(arr);
43  * int i;
44  *
45  * for (i = 0; i < 10; i++) {
46  *     BLI_array_grow_one(arr);
47  *     arr[i] = something;
48  * }
49  * BLI_array_free(arr);
50  * \endcode
51  *
52  * Arrays are over allocated, so each reallocation the array size is doubled.
53  * In situations where contiguous array access isn't needed,
54  * other solutions for allocation are available.
55  * Consider using on of: BLI_memarena.c, BLI_mempool.c, BLi_stack.c
56  */
57
58 #include <string.h>
59
60 #include "BLI_array.h"
61
62 #include "BLI_sys_types.h"
63
64 #include "MEM_guardedalloc.h"
65
66 /**
67  * This function is only to be called via macros.
68  *
69  * \note The caller must adjust \a arr_len
70  */
71 void _bli_array_grow_func(
72         void **arr_p, const void *arr_static,
73         const int sizeof_arr_p, const int arr_len, const int num,
74         const char *alloc_str)
75 {
76         void *arr = *arr_p;
77         void *arr_tmp;
78
79         arr_tmp = MEM_mallocN(
80                 sizeof_arr_p *
81                 ((num < arr_len) ?
82                  (arr_len * 2 + 2) : (arr_len + num)), alloc_str);
83
84         if (arr) {
85                 memcpy(arr_tmp, arr, sizeof_arr_p * arr_len);
86
87                 if (arr != arr_static) {
88                         MEM_freeN(arr);
89                 }
90         }
91
92         *arr_p = arr_tmp;
93
94         /* caller must do */
95 #if 0
96         arr_len += num;
97 #endif
98 }