19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2005 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "Vector"
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <string.h>
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdlib.h>
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h>
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Errors.h>
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/SharedBuffer.h>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/VectorImpl.h>
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*****************************************************************************/
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst size_t kMinVectorCapacity = 4;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic inline size_t max(size_t a, size_t b) {
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return a>b ? a : b;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectVectorImpl::VectorImpl(size_t itemSize, uint32_t flags)
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    : mStorage(0), mCount(0), mFlags(flags), mItemSize(itemSize)
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectVectorImpl::VectorImpl(const VectorImpl& rhs)
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    :   mStorage(rhs.mStorage), mCount(rhs.mCount),
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFlags(rhs.mFlags), mItemSize(rhs.mItemSize)
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mStorage) {
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedBuffer::sharedBuffer(mStorage)->acquire();
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectVectorImpl::~VectorImpl()
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_ASSERT(!mCount,
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "[%p] "
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "subclasses of VectorImpl must call finish_vector()"
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        " in their destructor. Leaking %d bytes.",
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this, (int)(mCount*mItemSize));
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // We can't call _do_destroy() here because the vtable is already gone.
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectVectorImpl& VectorImpl::operator = (const VectorImpl& rhs)
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_ASSERT(mItemSize == rhs.mItemSize,
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "Vector<> have different types (this=%p, rhs=%p)", this, &rhs);
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (this != &rhs) {
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        release_storage();
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (rhs.mCount) {
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStorage = rhs.mStorage;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCount = rhs.mCount;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SharedBuffer::sharedBuffer(mStorage)->acquire();
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStorage = 0;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCount = 0;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return *this;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid* VectorImpl::editArrayImpl()
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mStorage) {
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedBuffer* sb = SharedBuffer::sharedBuffer(mStorage)->attemptEdit();
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sb == 0) {
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sb = SharedBuffer::alloc(capacity() * mItemSize);
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sb) {
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                _do_copy(sb->data(), mStorage, mCount);
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                release_storage();
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStorage = sb->data();
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return mStorage;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsize_t VectorImpl::capacity() const
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mStorage) {
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return SharedBuffer::sharedBuffer(mStorage)->size() / mItemSize;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 0;
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t VectorImpl::insertVectorAt(const VectorImpl& vector, size_t index)
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1115c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    return insertArrayAt(vector.arrayImpl(), index, vector.size());
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t VectorImpl::appendVector(const VectorImpl& vector)
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return insertVectorAt(vector, size());
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1195c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brownssize_t VectorImpl::insertArrayAt(const void* array, size_t index, size_t length)
1205c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown{
1215c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    if (index > size())
1225c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return BAD_INDEX;
1235c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    void* where = _grow(index, length);
1245c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    if (where) {
1255c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        _do_copy(where, array, length);
1265c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    }
1275c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    return where ? index : (ssize_t)NO_MEMORY;
1285c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown}
1295c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
1305c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brownssize_t VectorImpl::appendArray(const void* array, size_t length)
1315c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown{
1325c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    return insertArrayAt(array, size(), length);
1335c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown}
1345c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t VectorImpl::insertAt(size_t index, size_t numItems)
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return insertAt(0, index, numItems);
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t VectorImpl::insertAt(const void* item, size_t index, size_t numItems)
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (index > size())
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return BAD_INDEX;
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void* where = _grow(index, numItems);
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (where) {
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (item) {
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            _do_splat(where, item, numItems);
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            _do_construct(where, numItems);
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return where ? index : (ssize_t)NO_MEMORY;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int sortProxy(const void* lhs, const void* rhs, void* func)
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (*(VectorImpl::compar_t)func)(lhs, rhs);
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t VectorImpl::sort(VectorImpl::compar_t cmp)
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return sort(sortProxy, (void*)cmp);
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t VectorImpl::sort(VectorImpl::compar_r_t cmp, void* state)
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // the sort must be stable. we're using insertion sort which
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // is well suited for small and already sorted arrays
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // for big arrays, it could be better to use mergesort
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ssize_t count = size();
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (count > 1) {
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void* array = const_cast<void*>(arrayImpl());
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void* temp = 0;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ssize_t i = 1;
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (i < count) {
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void* item = reinterpret_cast<char*>(array) + mItemSize*(i);
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void* curr = reinterpret_cast<char*>(array) + mItemSize*(i-1);
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (cmp(curr, item, state) > 0) {
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!temp) {
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // we're going to have to modify the array...
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    array = editArrayImpl();
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!array) return NO_MEMORY;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    temp = malloc(mItemSize);
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!temp) return NO_MEMORY;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    item = reinterpret_cast<char*>(array) + mItemSize*(i);
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    curr = reinterpret_cast<char*>(array) + mItemSize*(i-1);
188d74145285373193af8584ac86ee73c7aea3e1600Mathias Agopian                } else {
189d74145285373193af8584ac86ee73c7aea3e1600Mathias Agopian                    _do_destroy(temp, 1);
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                _do_copy(temp, item, 1);
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ssize_t j = i-1;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void* next = reinterpret_cast<char*>(array) + mItemSize*(i);
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                do {
197d74145285373193af8584ac86ee73c7aea3e1600Mathias Agopian                    _do_destroy(next, 1);
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    _do_copy(next, curr, 1);
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    next = curr;
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    --j;
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    curr = reinterpret_cast<char*>(array) + mItemSize*(j);
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } while (j>=0 && (cmp(curr, temp, state) > 0));
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
204d74145285373193af8584ac86ee73c7aea3e1600Mathias Agopian                _do_destroy(next, 1);
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                _do_copy(next, temp, 1);
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            i++;
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (temp) {
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            _do_destroy(temp, 1);
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            free(temp);
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NO_ERROR;
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid VectorImpl::pop()
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (size())
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        removeItemsAt(size()-1, 1);
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid VectorImpl::push()
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    push(0);
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid VectorImpl::push(const void* item)
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    insertAt(item, size());
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t VectorImpl::add()
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return add(0);
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2395c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brownssize_t VectorImpl::add(const void* item)
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2415c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    return insertAt(item, size());
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t VectorImpl::replaceAt(size_t index)
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return replaceAt(0, index);
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t VectorImpl::replaceAt(const void* prototype, size_t index)
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_ASSERT(index<size(),
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "[%p] replace: index=%d, size=%d", this, (int)index, (int)size());
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void* item = editItemLocation(index);
255ab561139f9e9c9df8a450f2990ad6588fa690e38Jeff Brown    if (item != prototype) {
256ab561139f9e9c9df8a450f2990ad6588fa690e38Jeff Brown        if (item == 0)
257ab561139f9e9c9df8a450f2990ad6588fa690e38Jeff Brown            return NO_MEMORY;
258ab561139f9e9c9df8a450f2990ad6588fa690e38Jeff Brown        _do_destroy(item, 1);
259ab561139f9e9c9df8a450f2990ad6588fa690e38Jeff Brown        if (prototype == 0) {
260ab561139f9e9c9df8a450f2990ad6588fa690e38Jeff Brown            _do_construct(item, 1);
261ab561139f9e9c9df8a450f2990ad6588fa690e38Jeff Brown        } else {
262ab561139f9e9c9df8a450f2990ad6588fa690e38Jeff Brown            _do_copy(item, prototype, 1);
263ab561139f9e9c9df8a450f2990ad6588fa690e38Jeff Brown        }
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return ssize_t(index);
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t VectorImpl::removeItemsAt(size_t index, size_t count)
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_ASSERT((index+count)<=size(),
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "[%p] remove: index=%d, count=%d, size=%d",
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               this, (int)index, (int)count, (int)size());
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if ((index+count) > size())
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return BAD_VALUE;
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project   _shrink(index, count);
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project   return index;
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid VectorImpl::finish_vector()
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    release_storage();
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mStorage = 0;
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mCount = 0;
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid VectorImpl::clear()
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    _shrink(0, mCount);
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid* VectorImpl::editItemLocation(size_t index)
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_ASSERT(index<capacity(),
295cf7e3a5984e1709004d3e1138780d60f97f46e75Mathias Agopian        "[%p] editItemLocation: index=%d, capacity=%d, count=%d",
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this, (int)index, (int)capacity(), (int)mCount);
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void* buffer = editArrayImpl();
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (buffer)
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reinterpret_cast<char*>(buffer) + index*mItemSize;
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 0;
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst void* VectorImpl::itemLocation(size_t index) const
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_ASSERT(index<capacity(),
307cf7e3a5984e1709004d3e1138780d60f97f46e75Mathias Agopian        "[%p] itemLocation: index=%d, capacity=%d, count=%d",
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this, (int)index, (int)capacity(), (int)mCount);
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const  void* buffer = arrayImpl();
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (buffer)
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reinterpret_cast<const char*>(buffer) + index*mItemSize;
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 0;
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t VectorImpl::setCapacity(size_t new_capacity)
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t current_capacity = capacity();
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t amount = new_capacity - size();
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (amount <= 0) {
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // we can't reduce the capacity
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return current_capacity;
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SharedBuffer* sb = SharedBuffer::alloc(new_capacity * mItemSize);
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (sb) {
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void* array = sb->data();
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        _do_copy(array, mStorage, size());
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        release_storage();
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStorage = const_cast<void*>(array);
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NO_MEMORY;
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return new_capacity;
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid VectorImpl::release_storage()
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mStorage) {
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const SharedBuffer* sb = SharedBuffer::sharedBuffer(mStorage);
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sb->release(SharedBuffer::eKeepStorage) == 1) {
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            _do_destroy(mStorage, mCount);
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SharedBuffer::dealloc(sb);
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid* VectorImpl::_grow(size_t where, size_t amount)
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//    LOGV("_grow(this=%p, where=%d, amount=%d) count=%d, capacity=%d",
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//        this, (int)where, (int)amount, (int)mCount, (int)capacity());
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35211bf79d6e3542e40ebd212b0f5d7cb3370f3068dJeff Brown    LOG_ASSERT(where <= mCount,
35311bf79d6e3542e40ebd212b0f5d7cb3370f3068dJeff Brown            "[%p] _grow: where=%d, amount=%d, count=%d",
35411bf79d6e3542e40ebd212b0f5d7cb3370f3068dJeff Brown            this, (int)where, (int)amount, (int)mCount); // caller already checked
35511bf79d6e3542e40ebd212b0f5d7cb3370f3068dJeff Brown
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const size_t new_size = mCount + amount;
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (capacity() < new_size) {
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const size_t new_capacity = max(kMinVectorCapacity, ((new_size*3)+1)/2);
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//        LOGV("grow vector %p, new_capacity=%d", this, (int)new_capacity);
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mStorage) &&
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (mCount==where) &&
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (mFlags & HAS_TRIVIAL_COPY) &&
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (mFlags & HAS_TRIVIAL_DTOR))
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const SharedBuffer* cur_sb = SharedBuffer::sharedBuffer(mStorage);
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SharedBuffer* sb = cur_sb->editResize(new_capacity * mItemSize);
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStorage = sb->data();
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SharedBuffer* sb = SharedBuffer::alloc(new_capacity * mItemSize);
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sb) {
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void* array = sb->data();
372ab561139f9e9c9df8a450f2990ad6588fa690e38Jeff Brown                if (where != 0) {
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    _do_copy(array, mStorage, where);
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
375ab561139f9e9c9df8a450f2990ad6588fa690e38Jeff Brown                if (where != mCount) {
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const void* from = reinterpret_cast<const uint8_t *>(mStorage) + where*mItemSize;
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    void* dest = reinterpret_cast<uint8_t *>(array) + (where+amount)*mItemSize;
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    _do_copy(dest, from, mCount-where);
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                release_storage();
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStorage = const_cast<void*>(array);
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
385ab561139f9e9c9df8a450f2990ad6588fa690e38Jeff Brown        if (where != mCount) {
386ab561139f9e9c9df8a450f2990ad6588fa690e38Jeff Brown            void* array = editArrayImpl();
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const void* from = reinterpret_cast<const uint8_t *>(array) + where*mItemSize;
388ab561139f9e9c9df8a450f2990ad6588fa690e38Jeff Brown            void* to = reinterpret_cast<uint8_t *>(array) + (where+amount)*mItemSize;
389ab561139f9e9c9df8a450f2990ad6588fa690e38Jeff Brown            _do_move_forward(to, from, mCount - where);
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
392ab561139f9e9c9df8a450f2990ad6588fa690e38Jeff Brown    mCount = new_size;
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void* free_space = const_cast<void*>(itemLocation(where));
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return free_space;
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid VectorImpl::_shrink(size_t where, size_t amount)
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!mStorage)
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//    LOGV("_shrink(this=%p, where=%d, amount=%d) count=%d, capacity=%d",
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//        this, (int)where, (int)amount, (int)mCount, (int)capacity());
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40511bf79d6e3542e40ebd212b0f5d7cb3370f3068dJeff Brown    LOG_ASSERT(where + amount <= mCount,
40611bf79d6e3542e40ebd212b0f5d7cb3370f3068dJeff Brown            "[%p] _shrink: where=%d, amount=%d, count=%d",
40711bf79d6e3542e40ebd212b0f5d7cb3370f3068dJeff Brown            this, (int)where, (int)amount, (int)mCount); // caller already checked
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const size_t new_size = mCount - amount;
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (new_size*3 < capacity()) {
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const size_t new_capacity = max(kMinVectorCapacity, new_size*2);
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//        LOGV("shrink vector %p, new_capacity=%d", this, (int)new_capacity);
413ab561139f9e9c9df8a450f2990ad6588fa690e38Jeff Brown        if ((where == new_size) &&
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (mFlags & HAS_TRIVIAL_COPY) &&
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (mFlags & HAS_TRIVIAL_DTOR))
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const SharedBuffer* cur_sb = SharedBuffer::sharedBuffer(mStorage);
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SharedBuffer* sb = cur_sb->editResize(new_capacity * mItemSize);
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStorage = sb->data();
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SharedBuffer* sb = SharedBuffer::alloc(new_capacity * mItemSize);
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sb) {
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void* array = sb->data();
424ab561139f9e9c9df8a450f2990ad6588fa690e38Jeff Brown                if (where != 0) {
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    _do_copy(array, mStorage, where);
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
427ab561139f9e9c9df8a450f2990ad6588fa690e38Jeff Brown                if (where != new_size) {
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const void* from = reinterpret_cast<const uint8_t *>(mStorage) + (where+amount)*mItemSize;
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    void* dest = reinterpret_cast<uint8_t *>(array) + where*mItemSize;
430ab561139f9e9c9df8a450f2990ad6588fa690e38Jeff Brown                    _do_copy(dest, from, new_size - where);
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                release_storage();
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStorage = const_cast<void*>(array);
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
437ab561139f9e9c9df8a450f2990ad6588fa690e38Jeff Brown        void* array = editArrayImpl();
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void* to = reinterpret_cast<uint8_t *>(array) + where*mItemSize;
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        _do_destroy(to, amount);
440ab561139f9e9c9df8a450f2990ad6588fa690e38Jeff Brown        if (where != new_size) {
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const void* from = reinterpret_cast<uint8_t *>(array) + (where+amount)*mItemSize;
442ab561139f9e9c9df8a450f2990ad6588fa690e38Jeff Brown            _do_move_backward(to, from, new_size - where);
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
445ab561139f9e9c9df8a450f2990ad6588fa690e38Jeff Brown    mCount = new_size;
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsize_t VectorImpl::itemSize() const {
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return mItemSize;
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid VectorImpl::_do_construct(void* storage, size_t num) const
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!(mFlags & HAS_TRIVIAL_CTOR)) {
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        do_construct(storage, num);
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid VectorImpl::_do_destroy(void* storage, size_t num) const
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!(mFlags & HAS_TRIVIAL_DTOR)) {
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        do_destroy(storage, num);
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid VectorImpl::_do_copy(void* dest, const void* from, size_t num) const
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!(mFlags & HAS_TRIVIAL_COPY)) {
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        do_copy(dest, from, num);
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        memcpy(dest, from, num*itemSize());
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid VectorImpl::_do_splat(void* dest, const void* item, size_t num) const {
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    do_splat(dest, item, num);
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid VectorImpl::_do_move_forward(void* dest, const void* from, size_t num) const {
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    do_move_forward(dest, from, num);
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid VectorImpl::_do_move_backward(void* dest, const void* from, size_t num) const {
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    do_move_backward(dest, from, num);
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid VectorImpl::reservedVectorImpl1() { }
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid VectorImpl::reservedVectorImpl2() { }
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid VectorImpl::reservedVectorImpl3() { }
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid VectorImpl::reservedVectorImpl4() { }
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid VectorImpl::reservedVectorImpl5() { }
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid VectorImpl::reservedVectorImpl6() { }
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid VectorImpl::reservedVectorImpl7() { }
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid VectorImpl::reservedVectorImpl8() { }
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*****************************************************************************/
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectSortedVectorImpl::SortedVectorImpl(size_t itemSize, uint32_t flags)
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    : VectorImpl(itemSize, flags)
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectSortedVectorImpl::SortedVectorImpl(const VectorImpl& rhs)
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project: VectorImpl(rhs)
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectSortedVectorImpl::~SortedVectorImpl()
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectSortedVectorImpl& SortedVectorImpl::operator = (const SortedVectorImpl& rhs)
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return static_cast<SortedVectorImpl&>( VectorImpl::operator = (static_cast<const VectorImpl&>(rhs)) );
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t SortedVectorImpl::indexOf(const void* item) const
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return _indexOrderOf(item);
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsize_t SortedVectorImpl::orderOf(const void* item) const
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t o;
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    _indexOrderOf(item, &o);
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return o;
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t SortedVectorImpl::_indexOrderOf(const void* item, size_t* order) const
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // binary search
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t err = NAME_NOT_FOUND;
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t l = 0;
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t h = size()-1;
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t mid;
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const void* a = arrayImpl();
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const size_t s = itemSize();
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (l <= h) {
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mid = l + (h - l)/2;
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const void* const curr = reinterpret_cast<const char *>(a) + (mid*s);
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const int c = do_compare(curr, item);
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c == 0) {
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            err = l = mid;
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (c < 0) {
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            l = mid + 1;
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            h = mid - 1;
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (order) *order = l;
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return err;
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t SortedVectorImpl::add(const void* item)
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t order;
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t index = _indexOrderOf(item, &order);
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (index < 0) {
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        index = VectorImpl::insertAt(item, order, 1);
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        index = VectorImpl::replaceAt(item, index);
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return index;
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t SortedVectorImpl::merge(const VectorImpl& vector)
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // naive merge...
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!vector.isEmpty()) {
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const void* buffer = vector.arrayImpl();
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const size_t is = itemSize();
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        size_t s = vector.size();
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (size_t i=0 ; i<s ; i++) {
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ssize_t err = add( reinterpret_cast<const char*>(buffer) + i*is );
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (err<0) {
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return err;
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NO_ERROR;
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t SortedVectorImpl::merge(const SortedVectorImpl& vector)
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // we've merging a sorted vector... nice!
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t err = NO_ERROR;
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!vector.isEmpty()) {
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // first take care of the case where the vectors are sorted together
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (do_compare(vector.itemLocation(vector.size()-1), arrayImpl()) <= 0) {
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            err = VectorImpl::insertVectorAt(static_cast<const VectorImpl&>(vector), 0);
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (do_compare(vector.arrayImpl(), itemLocation(size()-1)) >= 0) {
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            err = VectorImpl::appendVector(static_cast<const VectorImpl&>(vector));
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // this could be made a little better
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            err = merge(static_cast<const VectorImpl&>(vector));
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return err;
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t SortedVectorImpl::remove(const void* item)
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t i = indexOf(item);
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (i>=0) {
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        VectorImpl::removeItemsAt(i, 1);
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return i;
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid SortedVectorImpl::reservedSortedVectorImpl1() { };
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid SortedVectorImpl::reservedSortedVectorImpl2() { };
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid SortedVectorImpl::reservedSortedVectorImpl3() { };
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid SortedVectorImpl::reservedSortedVectorImpl4() { };
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid SortedVectorImpl::reservedSortedVectorImpl5() { };
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid SortedVectorImpl::reservedSortedVectorImpl6() { };
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid SortedVectorImpl::reservedSortedVectorImpl7() { };
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid SortedVectorImpl::reservedSortedVectorImpl8() { };
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*****************************************************************************/
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
625