1/* 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
47#define  AVECTOR_CLEAR(obj,name) \
48    do { \
49        (obj)->num_##name = 0; \
50    } while (0)
51
52#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 */
86