18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Copyright (C) 2007-2008 The Android Open Source Project 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This software is licensed under the terms of the GNU General Public 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** License version 2, as published by the Free Software Foundation, and 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** may be copied, distributed, and modified under those terms. 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This program is distributed in the hope that it will be useful, 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** but WITHOUT ANY WARRANTY; without even the implied warranty of 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** GNU General Public License for more details. 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*/ 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/reflist.h" 134c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#include "android/utils/system.h" 144c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#include "android/utils/assert.h" 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stdlib.h> 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <string.h> 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 184c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnerstatic void** _areflist_items(const ARefList* l) 194c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner{ 204c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner if (l->max == 1) 214c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner return (void**)&l->u.item0; 224c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner else 234c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner return l->u.items; 244c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner} 254c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 264c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnerstatic void 274c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner_areflist_checkSize0(ARefList* l) 284c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner{ 294c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner if (l->size == 0 && l->max > 1) { 304c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner AFREE(l->u.items); 314c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner l->max = 1; 324c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner l->u.item0 = NULL; 334c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner } 344c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner} 354c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectareflist_setEmpty(ARefList* l) 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (l->iteration > 0) { 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* deferred empty, set all items to NULL 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * to stop iterations */ 424c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner void** items = _areflist_items(l); 434c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner AARRAY_ZERO(items, l->count); 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project l->iteration |= 1; 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* direct empty */ 474c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner l->size = 0; 484c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner _areflist_checkSize0(l); 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project l->count = 0; 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint 544c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnerareflist_indexOf(const ARefList* l, void* item) 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (item) { 574c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner void** items = _areflist_items(l); 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void** end = items + l->count; 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void** ii = items; 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; ii < end; ii += 1 ) 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (*ii == item) 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (ii - items); 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectareflist_grow(ARefList* l, int count) 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 714c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner int newcount = l->size + count; 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (newcount > l->max) { 734c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner int oldmax = l->max; 744c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner int newmax; 754c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner void** items; 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 774c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner if (oldmax == 1) { 784c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner oldmax = 0; 794c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner items = NULL; 804c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner } else { 814c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner items = l->u.items; 824c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner } 834c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner newmax = oldmax; 844c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner while (newmax < newcount) 854c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner newmax += (newmax >> 1) + 4; 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 874c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner AARRAY_RENEW(items, newmax); 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 894c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner if (l->max == 1) 904c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner items[0] = l->u.item0; 914c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 924c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner l->u.items = items; 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project l->max = (uint16_t) newmax; 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectareflist_add(ARefList* l, void* item) 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (item) { 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void** items; 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1044c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner if (l->size >= l->max) { 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project areflist_grow(l, 1); 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1074c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner items = _areflist_items(l); 1084c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner items[l->size] = item; 1094c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner l->size += 1; 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project l->count += 1; 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1144c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnervoid 1154c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnerareflist_append(ARefList* l, const ARefList* l2) 1164c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner{ 1174c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner AREFLIST_FOREACH_CONST(l2, item, { 1184c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner areflist_add(l, item); 1194c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner }); 1204c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner} 1214c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid* 1234c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnerareflist_popLast(ARefList* l) 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void* item = NULL; 1264c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner void** items = _areflist_items(l); 1274c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner int nn; 1284c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 1294c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner if (l->count == 0) 1304c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner return NULL; 1314c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 1324c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner for (nn = l->size; nn > 0; nn--) { 1334c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner item = items[nn-1]; 1344c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner if (item != NULL) 1354c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner goto FOUND_LAST; 1364c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner } 1374c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner return NULL; 1384c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 1394c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' TurnerFOUND_LAST: 1404c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner /* we found the last non-NULL item in the array */ 1414c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner l->count -= 1; 1424c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner items[nn-1] = NULL; 1434c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 1444c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner if (l->iteration == 0) { 1454c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner l->size = nn; 1464c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner _areflist_checkSize0(l); 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return item; 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectABool 1524c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnerareflist_delFirst(ARefList* l, void* item) 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1544c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner if (item == NULL) 1554c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner return 0; 1564c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 1574c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner int index = areflist_indexOf(l, item); 1584c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner if (index < 0) 1594c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner return 0; 1604c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 1614c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner void** items = _areflist_items(l); 1624c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 1634c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner if (l->iteration > 0) { 1644c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner /* deferred deletion */ 1654c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner items[index] = NULL; 1664c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner l->iteration |= 1; 1674c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner l->count -= 1; 1684c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner } else { 1694c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner /* direct deletion */ 1704c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner if (l->max > 1) { 1714c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner AARRAY_MOVE(items + index, items + index + 1, l->size - index - 1); 1724c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner l->size -= 1; 1734c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner l->count -= 1; 1744c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner _areflist_checkSize0(l); 1754c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner } else { 1764c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner l->u.item0 = NULL; 1774c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner l->size = 0; 1784c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner l->count = 0; 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1814c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner return 1; 1824c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner} 1834c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 1844c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' TurnerABool 1854c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnerareflist_delAll(ARefList* l, void* item) 1864c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner{ 1874c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner ABool result = 0; 1884c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 1894c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner if (item == NULL) 1904c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner return 0; 1914c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 1924c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner void** items = _areflist_items(l); 1934c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner int readPos = 0; 1944c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner int writePos = 0; 1954c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 1964c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner /* don't modify the list until we find the item 1974c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner * or an EMPTY slot */ 1984c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner for ( ; readPos < l->size; readPos++ ) { 1994c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner if (items[readPos] == NULL || items[readPos] == item) 2004c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner goto COPY_LIST; 2014c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner } 2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 2034c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 2044c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' TurnerCOPY_LIST: 2054c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner writePos = readPos; 2064c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner for ( ; readPos < l->size; readPos++ ) { 2074c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner if (items[readPos] == NULL) { 2084c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner continue; 2094c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner } 2104c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner if (items[readPos] == item) { 2114c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner result = 1; 2124c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner continue; 2134c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner } 2144c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner items[writePos] = items[readPos]; 2154c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner writePos++; 2164c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner } 2174c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner l->count = l->size = (uint16_t) writePos; 2184c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner _areflist_checkSize0(l); 2194c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 2204c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner return result; 2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2234c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid 2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project_areflist_remove_deferred(ARefList* l) 2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (l->iteration & 1) { 2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* remove all NULL elements from the array */ 2294c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner void** items = _areflist_items(l); 2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int rr = 0; 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ww = 0; 2324c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner for ( ; rr < l->size; rr++ ) { 2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (items[rr] != NULL) 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project items[ww++] = items[rr]; 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2364c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner l->count = l->size = (uint16_t) ww; 2374c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner _areflist_checkSize0(l); 2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project l->iteration = 0; 2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2424c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnervoid 2434c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnerareflist_copy(ARefList* dst, const ARefList* src) 2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dst[0] = src[0]; 2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (src->max > 1) { 2484c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner dst->max = dst->count; 2494c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner AARRAY_NEW(dst->u.items, dst->max); 2504c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 2514c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner void** ritems = src->u.items; 2524c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner void** witems = _areflist_items(dst); 2534c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner int rr = 0; 2544c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner int ww = 0; 2554c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner for ( ; rr < src->size; rr++ ) { 2564c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner if (ritems[rr] != NULL) { 2574c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner witems[ww++] = ritems[rr]; 2584c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner } 2594c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner } 2604c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner dst->size = ww; 2614c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner AASSERT_TRUE(ww == dst->count); 2624c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner _areflist_checkSize0(dst); 2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid* 2674c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnerareflist_get(const ARefList* l, int n) 2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((unsigned)n >= (unsigned)l->count) 2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (l->max == 1) 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return l->u.item0; 2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return l->u.items[n]; 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid** 2794c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner_areflist_at(const ARefList* l, int n) 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void** items; 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2834c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner if ((unsigned)n >= (unsigned)l->size) 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2864c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner items = _areflist_items(l); 2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return items + n; 2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 289