blob: c576ec787fb65491eff5bc0bddfeb349b407e2e3 [file] [log] [blame]
David 'Digit' Turner4c0f7452010-11-17 17:55:17 +01001/* Copyright (C) 2009 The Android Open Source Project
2**
3** This software is licensed under the terms of the GNU General Public
4** License version 2, as published by the Free Software Foundation, and
5** may be copied, distributed, and modified under those terms.
6**
7** This program is distributed in the hope that it will be useful,
8** but WITHOUT ANY WARRANTY; without even the implied warranty of
9** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10** GNU General Public License for more details.
11*/
12#ifndef _ANDROID_UTILS_VECTOR_H
13#define _ANDROID_UTILS_VECTOR_H
14
15#include "android/utils/system.h"
16#include "android/utils/assert.h"
17
18#define AVECTOR_DECL(ctype,name) \
19 ctype* name; \
20 unsigned num_##name; \
21 unsigned max_##name \
22
23#define AVECTOR_SIZE(obj,name) \
24 (obj)->num_##name
25
26#define AVECTOR_INIT(obj,name) \
27 do { \
28 (obj)->name = NULL; \
29 (obj)->num_##name = 0; \
30 (obj)->max_##name = 0; \
31 } while (0)
32
33#define AVECTOR_INIT_ALLOC(obj,name,count) \
34 do { \
35 AARRAY_NEW0( (obj)->name, (count) ); \
36 (obj)->num_##name = 0; \
37 (obj)->max_##name = (count); \
38 } while (0)
39
40#define AVECTOR_DONE(obj,name) \
41 do { \
42 AFREE((obj)->name); \
43 (obj)->num_##name = 0; \
44 (obj)->max_##name = 0; \
45 } while (0)
46
David 'Digit' Turner7a17b602010-11-17 17:58:29 +010047#define AVECTOR_CLEAR(obj,name) \
48 do { \
49 (obj)->num_##name = 0; \
50 } while (0)
51
David 'Digit' Turner4c0f7452010-11-17 17:55:17 +010052#define AVECTOR_AT(obj,name,index) \
53 (&(obj)->name[(index)])
54
55#define AVECTOR_REALLOC(obj,name,newMax) \
56 do { \
57 AARRAY_RENEW((obj)->name,newMax); \
58 (obj)->max_##name = (newMax); \
59 } while(0)
60
61#define AVECTOR_ENSURE(obj,name,newCount) \
62 do { \
63 unsigned _newCount = (newCount); \
64 if (_newCount > (obj)->max_##name) \
65 AASSERT_LOC(); \
66 _avector_ensure( (void**)&(obj)->name, sizeof((obj)->name[0]), \
67 &(obj)->max_##name, _newCount ); \
68 } while (0);
69
70extern void _avector_ensure( void** items, size_t itemSize,
71 unsigned* pMaxItems, unsigned newCount );
72
73#define AVECTOR_FOREACH(obj,name,itemptr,statement) \
74 do { \
75 unsigned __vector_nn = 0; \
76 unsigned __vector_max = (obj)->num_##name; \
77 for ( ; __vector_nn < __vector_max; __vector_nn++ ) { \
78 itemptr = &(obj)->name[__vector_nn]; \
79 statement; \
80 } \
81 } while (0);
82
83/* */
84
85#endif /* _ANDROID_UTILS_VECTOR_H */