Vector.h revision a33bd1672fab3ac2ca72f2921716bf860d500aa3
1cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project/*
2cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Copyright (C) 2005 The Android Open Source Project
3cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project *
4cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * you may not use this file except in compliance with the License.
6cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * You may obtain a copy of the License at
7cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project *
8cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project *
10cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * See the License for the specific language governing permissions and
14cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * limitations under the License.
15cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */
16cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
17cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#ifndef ANDROID_VECTOR_H
18cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#define ANDROID_VECTOR_H
19cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
20cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <new>
21cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <stdint.h>
22cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <sys/types.h>
23cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
24cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <utils/Log.h>
25cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <utils/VectorImpl.h>
26cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <utils/TypeHelpers.h>
27cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
28cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// ---------------------------------------------------------------------------
29cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
30cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectnamespace android {
31cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
32cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project/*!
33cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * The main templated vector class ensuring type safety
34cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * while making use of VectorImpl.
35cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * This is the class users want to use.
36cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */
37cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
38cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate <class TYPE>
39cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectclass Vector : private VectorImpl
40cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{
41cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectpublic:
42cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            typedef TYPE    value_type;
43cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
44cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    /*!
45cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     * Constructors and destructors
46cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     */
47cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
48cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project                            Vector();
49cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project                            Vector(const Vector<TYPE>& rhs);
50cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    virtual                 ~Vector();
51cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
52cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    /*! copy operator */
53cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            const Vector<TYPE>&     operator = (const Vector<TYPE>& rhs) const;
54cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            Vector<TYPE>&           operator = (const Vector<TYPE>& rhs);
55cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
56cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    /*
57cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     * empty the vector
58cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     */
59cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
60cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    inline  void            clear()             { VectorImpl::clear(); }
61cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
62cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    /*!
63cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     * vector stats
64cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     */
65cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
66cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    //! returns number of items in the vector
67cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    inline  size_t          size() const                { return VectorImpl::size(); }
68cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    //! returns wether or not the vector is empty
69cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    inline  bool            isEmpty() const             { return VectorImpl::isEmpty(); }
70cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    //! returns how many items can be stored without reallocating the backing store
71cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    inline  size_t          capacity() const            { return VectorImpl::capacity(); }
72cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    //! setst the capacity. capacity can never be reduced less than size()
73cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    inline  ssize_t         setCapacity(size_t size)    { return VectorImpl::setCapacity(size); }
74cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
75cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    /*!
76cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     * C-style array access
77cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     */
78cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
79cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    //! read-only C-style access
80cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    inline  const TYPE*     array() const;
81cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    //! read-write C-style access
82cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            TYPE*           editArray();
83cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
84cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    /*!
85cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     * accessors
86cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     */
87cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
88cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    //! read-only access to an item at a given index
89cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    inline  const TYPE&     operator [] (size_t index) const;
90cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    //! alternate name for operator []
91cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    inline  const TYPE&     itemAt(size_t index) const;
92cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    //! stack-usage of the vector. returns the top of the stack (last element)
93cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            const TYPE&     top() const;
94cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    //! same as operator [], but allows to access the vector backward (from the end) with a negative index
95cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            const TYPE&     mirrorItemAt(ssize_t index) const;
96cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
97cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    /*!
98cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     * modifing the array
99cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     */
100cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
101cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    //! copy-on write support, grants write access to an item
102cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            TYPE&           editItemAt(size_t index);
103cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    //! grants right acces to the top of the stack (last element)
104cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            TYPE&           editTop();
105cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
106cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            /*!
107cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project             * append/insert another vector
108cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project             */
109cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
110cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    //! insert another vector at a given index
111cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            ssize_t         insertVectorAt(const Vector<TYPE>& vector, size_t index);
112cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
113cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    //! append another vector at the end of this one
114cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            ssize_t         appendVector(const Vector<TYPE>& vector);
115cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
116cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
117cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            /*!
118cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project             * add/insert/replace items
119cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project             */
120cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
121cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    //! insert one or several items initialized with their default constructor
122cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    inline  ssize_t         insertAt(size_t index, size_t numItems = 1);
123cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    //! insert on onr several items initialized from a prototype item
124cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            ssize_t         insertAt(const TYPE& prototype_item, size_t index, size_t numItems = 1);
125cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    //! pop the top of the stack (removes the last element). No-op if the stack's empty
126cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    inline  void            pop();
127cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    //! pushes an item initialized with its default constructor
128cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    inline  void            push();
129cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    //! pushes an item on the top of the stack
130cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            void            push(const TYPE& item);
131cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    //! same as push() but returns the index the item was added at (or an error)
132cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    inline  ssize_t         add();
133cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    //! same as push() but returns the index the item was added at (or an error)
134cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            ssize_t         add(const TYPE& item);
135cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    //! replace an item with a new one initialized with its default constructor
136cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    inline  ssize_t         replaceAt(size_t index);
137cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    //! replace an item with a new one
138cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            ssize_t         replaceAt(const TYPE& item, size_t index);
139cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
140cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    /*!
141cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     * remove items
142cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     */
143cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
144cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    //! remove several items
145cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    inline  ssize_t         removeItemsAt(size_t index, size_t count = 1);
146cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    //! remove one item
147cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    inline  ssize_t         removeAt(size_t index)  { return removeItemsAt(index); }
148cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
149cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    /*!
150cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     * sort (stable) the array
151cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     */
152cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
153cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     typedef int (*compar_t)(const TYPE* lhs, const TYPE* rhs);
154cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     typedef int (*compar_r_t)(const TYPE* lhs, const TYPE* rhs, void* state);
155cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
156cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     inline status_t        sort(compar_t cmp);
157cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     inline status_t        sort(compar_r_t cmp, void* state);
158cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
159cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectprotected:
160cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    virtual void    do_construct(void* storage, size_t num) const;
161cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    virtual void    do_destroy(void* storage, size_t num) const;
162cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    virtual void    do_copy(void* dest, const void* from, size_t num) const;
163cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    virtual void    do_splat(void* dest, const void* item, size_t num) const;
164cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    virtual void    do_move_forward(void* dest, const void* from, size_t num) const;
165cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    virtual void    do_move_backward(void* dest, const void* from, size_t num) const;
166cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project};
167cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
168cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
169cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// ---------------------------------------------------------------------------
170cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// No user serviceable parts from here...
171cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// ---------------------------------------------------------------------------
172cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
173cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE> inline
174cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source ProjectVector<TYPE>::Vector()
175cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    : VectorImpl(sizeof(TYPE),
176cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project                ((traits<TYPE>::has_trivial_ctor   ? HAS_TRIVIAL_CTOR   : 0)
177cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project                |(traits<TYPE>::has_trivial_dtor   ? HAS_TRIVIAL_DTOR   : 0)
178a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian                |(traits<TYPE>::has_trivial_copy   ? HAS_TRIVIAL_COPY   : 0))
179cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project                )
180cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{
181cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
182cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
183cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE> inline
184cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source ProjectVector<TYPE>::Vector(const Vector<TYPE>& rhs)
185cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    : VectorImpl(rhs) {
186cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
187cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
188cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE> inline
189cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source ProjectVector<TYPE>::~Vector() {
190cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    finish_vector();
191cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
192cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
193cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE> inline
194cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source ProjectVector<TYPE>& Vector<TYPE>::operator = (const Vector<TYPE>& rhs) {
195cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    VectorImpl::operator = (rhs);
196cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return *this;
197cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
198cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
199cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE> inline
200cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectconst Vector<TYPE>& Vector<TYPE>::operator = (const Vector<TYPE>& rhs) const {
201cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    VectorImpl::operator = (rhs);
202cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return *this;
203cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
204cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
205cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE> inline
206cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectconst TYPE* Vector<TYPE>::array() const {
207cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return static_cast<const TYPE *>(arrayImpl());
208cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
209cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
210cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE> inline
211cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source ProjectTYPE* Vector<TYPE>::editArray() {
212cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return static_cast<TYPE *>(editArrayImpl());
213cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
214cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
215cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
216cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE> inline
217cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectconst TYPE& Vector<TYPE>::operator[](size_t index) const {
218cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    LOG_FATAL_IF( index>=size(),
219cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project                  "itemAt: index %d is past size %d", (int)index, (int)size() );
220cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return *(array() + index);
221cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
222cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
223cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE> inline
224cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectconst TYPE& Vector<TYPE>::itemAt(size_t index) const {
225cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return operator[](index);
226cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
227cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
228cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE> inline
229cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectconst TYPE& Vector<TYPE>::mirrorItemAt(ssize_t index) const {
230cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    LOG_FATAL_IF( (index>0 ? index : -index)>=size(),
231cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project                  "mirrorItemAt: index %d is past size %d",
232cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project                  (int)index, (int)size() );
233cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return *(array() + ((index<0) ? (size()-index) : index));
234cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
235cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
236cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE> inline
237cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectconst TYPE& Vector<TYPE>::top() const {
238cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return *(array() + size() - 1);
239cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
240cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
241cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE> inline
242cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source ProjectTYPE& Vector<TYPE>::editItemAt(size_t index) {
243cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return *( static_cast<TYPE *>(editItemLocation(index)) );
244cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
245cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
246cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE> inline
247cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source ProjectTYPE& Vector<TYPE>::editTop() {
248cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return *( static_cast<TYPE *>(editItemLocation(size()-1)) );
249cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
250cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
251cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE> inline
252cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectssize_t Vector<TYPE>::insertVectorAt(const Vector<TYPE>& vector, size_t index) {
253cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return VectorImpl::insertVectorAt(reinterpret_cast<const VectorImpl&>(vector), index);
254cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
255cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
256cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE> inline
257cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectssize_t Vector<TYPE>::appendVector(const Vector<TYPE>& vector) {
258cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return VectorImpl::appendVector(reinterpret_cast<const VectorImpl&>(vector));
259cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
260cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
261cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE> inline
262cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectssize_t Vector<TYPE>::insertAt(const TYPE& item, size_t index, size_t numItems) {
263cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return VectorImpl::insertAt(&item, index, numItems);
264cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
265cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
266cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE> inline
267cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectvoid Vector<TYPE>::push(const TYPE& item) {
268cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return VectorImpl::push(&item);
269cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
270cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
271cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE> inline
272cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectssize_t Vector<TYPE>::add(const TYPE& item) {
273cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return VectorImpl::add(&item);
274cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
275cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
276cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE> inline
277cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectssize_t Vector<TYPE>::replaceAt(const TYPE& item, size_t index) {
278cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return VectorImpl::replaceAt(&item, index);
279cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
280cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
281cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE> inline
282cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectssize_t Vector<TYPE>::insertAt(size_t index, size_t numItems) {
283cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return VectorImpl::insertAt(index, numItems);
284cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
285cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
286cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE> inline
287cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectvoid Vector<TYPE>::pop() {
288cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    VectorImpl::pop();
289cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
290cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
291cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE> inline
292cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectvoid Vector<TYPE>::push() {
293cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    VectorImpl::push();
294cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
295cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
296cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE> inline
297cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectssize_t Vector<TYPE>::add() {
298cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return VectorImpl::add();
299cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
300cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
301cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE> inline
302cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectssize_t Vector<TYPE>::replaceAt(size_t index) {
303cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return VectorImpl::replaceAt(index);
304cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
305cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
306cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE> inline
307cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectssize_t Vector<TYPE>::removeItemsAt(size_t index, size_t count) {
308cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return VectorImpl::removeItemsAt(index, count);
309cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
310cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
311cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE> inline
312cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectstatus_t Vector<TYPE>::sort(Vector<TYPE>::compar_t cmp) {
313cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return VectorImpl::sort((VectorImpl::compar_t)cmp);
314cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
315cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
316cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE> inline
317cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectstatus_t Vector<TYPE>::sort(Vector<TYPE>::compar_r_t cmp, void* state) {
318cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return VectorImpl::sort((VectorImpl::compar_r_t)cmp, state);
319cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
320cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
321cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// ---------------------------------------------------------------------------
322cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
323cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE>
324cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectvoid Vector<TYPE>::do_construct(void* storage, size_t num) const {
325cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    construct_type( reinterpret_cast<TYPE*>(storage), num );
326cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
327cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
328cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE>
329cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectvoid Vector<TYPE>::do_destroy(void* storage, size_t num) const {
330cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    destroy_type( reinterpret_cast<TYPE*>(storage), num );
331cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
332cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
333cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE>
334cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectvoid Vector<TYPE>::do_copy(void* dest, const void* from, size_t num) const {
335cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    copy_type( reinterpret_cast<TYPE*>(dest), reinterpret_cast<const TYPE*>(from), num );
336cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
337cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
338cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE>
339cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectvoid Vector<TYPE>::do_splat(void* dest, const void* item, size_t num) const {
340cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    splat_type( reinterpret_cast<TYPE*>(dest), reinterpret_cast<const TYPE*>(item), num );
341cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
342cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
343cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE>
344cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectvoid Vector<TYPE>::do_move_forward(void* dest, const void* from, size_t num) const {
345cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    move_forward_type( reinterpret_cast<TYPE*>(dest), reinterpret_cast<const TYPE*>(from), num );
346cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
347cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
348cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<class TYPE>
349cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectvoid Vector<TYPE>::do_move_backward(void* dest, const void* from, size_t num) const {
350cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    move_backward_type( reinterpret_cast<TYPE*>(dest), reinterpret_cast<const TYPE*>(from), num );
351cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
352cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
353cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}; // namespace android
354cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
355cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
356cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// ---------------------------------------------------------------------------
357cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
358cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#endif // ANDROID_VECTOR_H
359