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