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
477a17b608de24e3aaf7d5ca030bb80a74dcc3baf9David 'Digit' Turner#define  AVECTOR_CLEAR(obj,name) \
487a17b608de24e3aaf7d5ca030bb80a74dcc3baf9David 'Digit' Turner    do { \
497a17b608de24e3aaf7d5ca030bb80a74dcc3baf9David 'Digit' Turner        (obj)->num_##name = 0; \
507a17b608de24e3aaf7d5ca030bb80a74dcc3baf9David 'Digit' Turner    } while (0)
517a17b608de24e3aaf7d5ca030bb80a74dcc3baf9David 'Digit' Turner
524c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#define  AVECTOR_AT(obj,name,index)  \
534c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    (&(obj)->name[(index)])
544c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
554c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#define  AVECTOR_REALLOC(obj,name,newMax) \
564c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    do { \
574c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        AARRAY_RENEW((obj)->name,newMax); \
584c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        (obj)->max_##name = (newMax); \
594c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    } while(0)
604c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
614c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#define  AVECTOR_ENSURE(obj,name,newCount) \
624c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    do { \
634c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        unsigned  _newCount = (newCount); \
644c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        if (_newCount > (obj)->max_##name) \
654c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner            AASSERT_LOC(); \
664c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner            _avector_ensure( (void**)&(obj)->name, sizeof((obj)->name[0]), \
674c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner                             &(obj)->max_##name, _newCount ); \
684c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    } while (0);
694c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
704c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnerextern void  _avector_ensure( void**  items, size_t  itemSize,
714c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner                              unsigned*  pMaxItems, unsigned  newCount );
724c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
734c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#define  AVECTOR_FOREACH(obj,name,itemptr,statement) \
744c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    do { \
754c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        unsigned __vector_nn = 0; \
764c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        unsigned __vector_max = (obj)->num_##name; \
774c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        for ( ; __vector_nn < __vector_max; __vector_nn++ ) { \
784c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner            itemptr = &(obj)->name[__vector_nn]; \
794c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner            statement; \
804c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        } \
814c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    } while (0);
824c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
834c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner/* */
844c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
854c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#endif /* _ANDROID_UTILS_VECTOR_H */
86