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