doxygen: blenkernel under core as module.
[blender.git] / source / blender / blenkernel / BKE_array_mallocn.h
1 /*
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * The Original Code is: all of this file.
24  *
25  * Contributor(s): none yet.
26  *
27  * ***** END GPL LICENSE BLOCK *****
28 */
29
30 #ifndef BKE_ARRAY_MALLOCN_H
31 #define BKE_ARRAY_MALLOCN_H
32
33 /** \file BKE_array_mallocn.h
34  *  \ingroup bke
35  *  \brief little array macro library.
36  */
37
38 /* example of usage:
39
40 int *arr = NULL;
41 V_DECLARE(arr);
42 int i;
43
44 for (i=0; i<10; i++) {
45         V_GROW(arr);
46         arr[i] = something;
47 }
48 V_FREE(arr);
49
50 arrays are buffered, using double-buffering (so on each reallocation,
51 the array size is doubled).  supposedly this should give good Big Oh
52 behaviour, though it may not be the best in practice.
53 */
54
55 #define V_DECLARE(vec) int _##vec##_count=0; void *_##vec##_tmp
56
57 /*in the future, I plan on having V_DECLARE allocate stack memory it'll
58   use at first, and switch over to heap when it needs more.  that'll mess
59   up cases where you'd want to use this API to build a dynamic list for
60   non-local use, so all such cases should use this macro.*/
61 #define V_DYNDECLARE(vec) V_DECLARE(vec)
62
63 /*this returns the entire size of the array, including any buffering.*/
64 #define V_SIZE(vec) ((signed int)((vec)==NULL ? 0 : MEM_allocN_len(vec) / sizeof(*vec)))
65
66 /*this returns the logical size of the array, not including buffering.*/
67 #define V_COUNT(vec) _##vec##_count
68
69 /*grow the array by one.  zeroes the new elements.*/
70 #define V_GROW(vec) \
71         V_SIZE(vec) > _##vec##_count ? _##vec##_count++ : \
72         ((_##vec##_tmp = MEM_callocN(sizeof(*vec)*(_##vec##_count*2+2), #vec " " __FILE__ " ")),\
73         (void)(vec && memcpy(_##vec##_tmp, vec, sizeof(*vec) * _##vec##_count)),\
74         (void)(vec && (MEM_freeN(vec),1)),\
75         (vec = _##vec##_tmp),\
76         _##vec##_count++)
77
78 #define V_FREE(vec) if (vec) MEM_freeN(vec);
79
80 /*resets the logical size of an array to zero, but doesn't
81   free the memory.*/
82 #define V_RESET(vec) _##vec##_count=0
83
84 /*set the count of the array*/
85 #define V_SETCOUNT(vec, count) _##vec##_count = (count)
86
87 #endif // BKE_ARRAY_MALLOCN_H