vector.h revision 4c0f745dc80d392fddea23eb8d4d7d86425ce0c6
14c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner/* Copyright (C) 2009 The Android Open Source Project
24c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner**
34c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner** This software is licensed under the terms of the GNU General Public
44c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner** License version 2, as published by the Free Software Foundation, and
54c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner** may be copied, distributed, and modified under those terms.
64c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner**
74c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner** This program is distributed in the hope that it will be useful,
84c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner** but WITHOUT ANY WARRANTY; without even the implied warranty of
94c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
104c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner** GNU General Public License for more details.
114c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner*/
124c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#ifndef _ANDROID_UTILS_VECTOR_H
134c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#define _ANDROID_UTILS_VECTOR_H
144c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
154c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#include "android/utils/system.h"
164c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#include "android/utils/assert.h"
174c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
184c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#define  AVECTOR_DECL(ctype,name)  \
194c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    ctype*    name; \
204c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    unsigned  num_##name; \
214c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    unsigned  max_##name \
224c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
234c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#define  AVECTOR_SIZE(obj,name)  \
244c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    (obj)->num_##name
254c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
264c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#define  AVECTOR_INIT(obj,name)   \
274c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    do { \
284c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        (obj)->name = NULL; \
294c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        (obj)->num_##name = 0; \
304c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        (obj)->max_##name = 0; \
314c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    } while (0)
324c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
334c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#define  AVECTOR_INIT_ALLOC(obj,name,count) \
344c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    do { \
354c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        AARRAY_NEW0( (obj)->name, (count) ); \
364c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        (obj)->num_##name = 0; \
374c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        (obj)->max_##name = (count); \
384c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    } while (0)
394c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
404c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#define  AVECTOR_DONE(obj,name)  \
414c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    do { \
424c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        AFREE((obj)->name); \
434c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        (obj)->num_##name = 0; \
444c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        (obj)->max_##name = 0; \
454c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    } while (0)
464c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
474c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#define  AVECTOR_AT(obj,name,index)  \
484c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    (&(obj)->name[(index)])
494c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
504c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#define  AVECTOR_REALLOC(obj,name,newMax) \
514c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    do { \
524c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        AARRAY_RENEW((obj)->name,newMax); \
534c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        (obj)->max_##name = (newMax); \
544c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    } while(0)
554c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
564c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#define  AVECTOR_ENSURE(obj,name,newCount) \
574c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    do { \
584c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        unsigned  _newCount = (newCount); \
594c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        if (_newCount > (obj)->max_##name) \
604c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner            AASSERT_LOC(); \
614c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner            _avector_ensure( (void**)&(obj)->name, sizeof((obj)->name[0]), \
624c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner                             &(obj)->max_##name, _newCount ); \
634c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    } while (0);
644c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
654c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnerextern void  _avector_ensure( void**  items, size_t  itemSize,
664c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner                              unsigned*  pMaxItems, unsigned  newCount );
674c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
684c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#define  AVECTOR_FOREACH(obj,name,itemptr,statement) \
694c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    do { \
704c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        unsigned __vector_nn = 0; \
714c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        unsigned __vector_max = (obj)->num_##name; \
724c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        for ( ; __vector_nn < __vector_max; __vector_nn++ ) { \
734c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner            itemptr = &(obj)->name[__vector_nn]; \
744c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner            statement; \
754c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        } \
764c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    } while (0);
774c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
784c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner/* */
794c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
804c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#endif /* _ANDROID_UTILS_VECTOR_H */
81