xref: /aosp_15_r20/external/angle/src/common/FixedVector.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2018 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // FixedVector.h:
7*8975f5c5SAndroid Build Coastguard Worker //   A vector class with a maximum size and fixed storage.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #ifndef COMMON_FIXEDVECTOR_H_
11*8975f5c5SAndroid Build Coastguard Worker #define COMMON_FIXEDVECTOR_H_
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include "common/debug.h"
14*8975f5c5SAndroid Build Coastguard Worker 
15*8975f5c5SAndroid Build Coastguard Worker #include <algorithm>
16*8975f5c5SAndroid Build Coastguard Worker #include <array>
17*8975f5c5SAndroid Build Coastguard Worker #include <initializer_list>
18*8975f5c5SAndroid Build Coastguard Worker 
19*8975f5c5SAndroid Build Coastguard Worker namespace angle
20*8975f5c5SAndroid Build Coastguard Worker {
21*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage = std::array<T, N>>
22*8975f5c5SAndroid Build Coastguard Worker class FixedVector final
23*8975f5c5SAndroid Build Coastguard Worker {
24*8975f5c5SAndroid Build Coastguard Worker   public:
25*8975f5c5SAndroid Build Coastguard Worker     using value_type             = typename Storage::value_type;
26*8975f5c5SAndroid Build Coastguard Worker     using size_type              = typename Storage::size_type;
27*8975f5c5SAndroid Build Coastguard Worker     using reference              = typename Storage::reference;
28*8975f5c5SAndroid Build Coastguard Worker     using const_reference        = typename Storage::const_reference;
29*8975f5c5SAndroid Build Coastguard Worker     using pointer                = typename Storage::pointer;
30*8975f5c5SAndroid Build Coastguard Worker     using const_pointer          = typename Storage::const_pointer;
31*8975f5c5SAndroid Build Coastguard Worker     using iterator               = typename Storage::iterator;
32*8975f5c5SAndroid Build Coastguard Worker     using const_iterator         = typename Storage::const_iterator;
33*8975f5c5SAndroid Build Coastguard Worker     using reverse_iterator       = typename Storage::reverse_iterator;
34*8975f5c5SAndroid Build Coastguard Worker     using const_reverse_iterator = typename Storage::const_reverse_iterator;
35*8975f5c5SAndroid Build Coastguard Worker 
36*8975f5c5SAndroid Build Coastguard Worker     FixedVector();
37*8975f5c5SAndroid Build Coastguard Worker     FixedVector(size_type count, const value_type &value);
38*8975f5c5SAndroid Build Coastguard Worker     FixedVector(size_type count);
39*8975f5c5SAndroid Build Coastguard Worker 
40*8975f5c5SAndroid Build Coastguard Worker     FixedVector(const FixedVector<T, N, Storage> &other);
41*8975f5c5SAndroid Build Coastguard Worker     FixedVector(FixedVector<T, N, Storage> &&other);
42*8975f5c5SAndroid Build Coastguard Worker     FixedVector(std::initializer_list<value_type> init);
43*8975f5c5SAndroid Build Coastguard Worker 
44*8975f5c5SAndroid Build Coastguard Worker     FixedVector<T, N, Storage> &operator=(const FixedVector<T, N, Storage> &other);
45*8975f5c5SAndroid Build Coastguard Worker     FixedVector<T, N, Storage> &operator=(FixedVector<T, N, Storage> &&other);
46*8975f5c5SAndroid Build Coastguard Worker     FixedVector<T, N, Storage> &operator=(std::initializer_list<value_type> init);
47*8975f5c5SAndroid Build Coastguard Worker 
48*8975f5c5SAndroid Build Coastguard Worker     // Makes class trivially destructible.
49*8975f5c5SAndroid Build Coastguard Worker     ~FixedVector() = default;
50*8975f5c5SAndroid Build Coastguard Worker 
51*8975f5c5SAndroid Build Coastguard Worker     reference at(size_type pos);
52*8975f5c5SAndroid Build Coastguard Worker     const_reference at(size_type pos) const;
53*8975f5c5SAndroid Build Coastguard Worker 
54*8975f5c5SAndroid Build Coastguard Worker     reference operator[](size_type pos);
55*8975f5c5SAndroid Build Coastguard Worker     const_reference operator[](size_type pos) const;
56*8975f5c5SAndroid Build Coastguard Worker 
57*8975f5c5SAndroid Build Coastguard Worker     pointer data();
58*8975f5c5SAndroid Build Coastguard Worker     const_pointer data() const;
59*8975f5c5SAndroid Build Coastguard Worker 
60*8975f5c5SAndroid Build Coastguard Worker     iterator begin();
61*8975f5c5SAndroid Build Coastguard Worker     const_iterator begin() const;
62*8975f5c5SAndroid Build Coastguard Worker 
63*8975f5c5SAndroid Build Coastguard Worker     iterator end();
64*8975f5c5SAndroid Build Coastguard Worker     const_iterator end() const;
65*8975f5c5SAndroid Build Coastguard Worker 
66*8975f5c5SAndroid Build Coastguard Worker     bool empty() const;
67*8975f5c5SAndroid Build Coastguard Worker     size_type size() const;
68*8975f5c5SAndroid Build Coastguard Worker     static constexpr size_type max_size();
69*8975f5c5SAndroid Build Coastguard Worker 
70*8975f5c5SAndroid Build Coastguard Worker     void clear();
71*8975f5c5SAndroid Build Coastguard Worker 
72*8975f5c5SAndroid Build Coastguard Worker     void push_back(const value_type &value);
73*8975f5c5SAndroid Build Coastguard Worker     void push_back(value_type &&value);
74*8975f5c5SAndroid Build Coastguard Worker 
75*8975f5c5SAndroid Build Coastguard Worker     template <class... Args>
76*8975f5c5SAndroid Build Coastguard Worker     void emplace_back(Args &&...args);
77*8975f5c5SAndroid Build Coastguard Worker 
78*8975f5c5SAndroid Build Coastguard Worker     void pop_back();
79*8975f5c5SAndroid Build Coastguard Worker     reference back();
80*8975f5c5SAndroid Build Coastguard Worker     const_reference back() const;
81*8975f5c5SAndroid Build Coastguard Worker 
82*8975f5c5SAndroid Build Coastguard Worker     void swap(FixedVector<T, N, Storage> &other);
83*8975f5c5SAndroid Build Coastguard Worker 
84*8975f5c5SAndroid Build Coastguard Worker     void resize(size_type count);
85*8975f5c5SAndroid Build Coastguard Worker     void resize(size_type count, const value_type &value);
86*8975f5c5SAndroid Build Coastguard Worker 
87*8975f5c5SAndroid Build Coastguard Worker     bool full() const;
88*8975f5c5SAndroid Build Coastguard Worker 
89*8975f5c5SAndroid Build Coastguard Worker   private:
90*8975f5c5SAndroid Build Coastguard Worker     void assign_from_initializer_list(std::initializer_list<value_type> init);
91*8975f5c5SAndroid Build Coastguard Worker 
92*8975f5c5SAndroid Build Coastguard Worker     Storage mStorage;
93*8975f5c5SAndroid Build Coastguard Worker     size_type mSize = 0;
94*8975f5c5SAndroid Build Coastguard Worker };
95*8975f5c5SAndroid Build Coastguard Worker 
96*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
97*8975f5c5SAndroid Build Coastguard Worker bool operator==(const FixedVector<T, N, Storage> &a, const FixedVector<T, N, Storage> &b)
98*8975f5c5SAndroid Build Coastguard Worker {
99*8975f5c5SAndroid Build Coastguard Worker     return a.size() == b.size() && std::equal(a.begin(), a.end(), b.begin());
100*8975f5c5SAndroid Build Coastguard Worker }
101*8975f5c5SAndroid Build Coastguard Worker 
102*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
103*8975f5c5SAndroid Build Coastguard Worker bool operator!=(const FixedVector<T, N, Storage> &a, const FixedVector<T, N, Storage> &b)
104*8975f5c5SAndroid Build Coastguard Worker {
105*8975f5c5SAndroid Build Coastguard Worker     return !(a == b);
106*8975f5c5SAndroid Build Coastguard Worker }
107*8975f5c5SAndroid Build Coastguard Worker 
108*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
109*8975f5c5SAndroid Build Coastguard Worker FixedVector<T, N, Storage>::FixedVector() = default;
110*8975f5c5SAndroid Build Coastguard Worker 
111*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
FixedVector(size_type count,const value_type & value)112*8975f5c5SAndroid Build Coastguard Worker FixedVector<T, N, Storage>::FixedVector(size_type count, const value_type &value) : mSize(count)
113*8975f5c5SAndroid Build Coastguard Worker {
114*8975f5c5SAndroid Build Coastguard Worker     ASSERT(count <= N);
115*8975f5c5SAndroid Build Coastguard Worker     std::fill(mStorage.begin(), mStorage.begin() + count, value);
116*8975f5c5SAndroid Build Coastguard Worker }
117*8975f5c5SAndroid Build Coastguard Worker 
118*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
FixedVector(size_type count)119*8975f5c5SAndroid Build Coastguard Worker FixedVector<T, N, Storage>::FixedVector(size_type count) : mSize(count)
120*8975f5c5SAndroid Build Coastguard Worker {
121*8975f5c5SAndroid Build Coastguard Worker     ASSERT(count <= N);
122*8975f5c5SAndroid Build Coastguard Worker }
123*8975f5c5SAndroid Build Coastguard Worker 
124*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
125*8975f5c5SAndroid Build Coastguard Worker FixedVector<T, N, Storage>::FixedVector(const FixedVector<T, N, Storage> &other) = default;
126*8975f5c5SAndroid Build Coastguard Worker 
127*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
FixedVector(FixedVector<T,N,Storage> && other)128*8975f5c5SAndroid Build Coastguard Worker FixedVector<T, N, Storage>::FixedVector(FixedVector<T, N, Storage> &&other)
129*8975f5c5SAndroid Build Coastguard Worker     : mStorage(std::move(other.mStorage)), mSize(other.mSize)
130*8975f5c5SAndroid Build Coastguard Worker {
131*8975f5c5SAndroid Build Coastguard Worker     other.mSize = 0;
132*8975f5c5SAndroid Build Coastguard Worker }
133*8975f5c5SAndroid Build Coastguard Worker 
134*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
FixedVector(std::initializer_list<value_type> init)135*8975f5c5SAndroid Build Coastguard Worker FixedVector<T, N, Storage>::FixedVector(std::initializer_list<value_type> init)
136*8975f5c5SAndroid Build Coastguard Worker {
137*8975f5c5SAndroid Build Coastguard Worker     ASSERT(init.size() <= N);
138*8975f5c5SAndroid Build Coastguard Worker     assign_from_initializer_list(init);
139*8975f5c5SAndroid Build Coastguard Worker }
140*8975f5c5SAndroid Build Coastguard Worker 
141*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
142*8975f5c5SAndroid Build Coastguard Worker FixedVector<T, N, Storage> &FixedVector<T, N, Storage>::operator=(
143*8975f5c5SAndroid Build Coastguard Worker     const FixedVector<T, N, Storage> &other) = default;
144*8975f5c5SAndroid Build Coastguard Worker 
145*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
146*8975f5c5SAndroid Build Coastguard Worker FixedVector<T, N, Storage> &FixedVector<T, N, Storage>::operator=(
147*8975f5c5SAndroid Build Coastguard Worker     FixedVector<T, N, Storage> &&other)
148*8975f5c5SAndroid Build Coastguard Worker {
149*8975f5c5SAndroid Build Coastguard Worker     mStorage    = std::move(other.mStorage);
150*8975f5c5SAndroid Build Coastguard Worker     mSize       = other.mSize;
151*8975f5c5SAndroid Build Coastguard Worker     other.mSize = 0;
152*8975f5c5SAndroid Build Coastguard Worker     return *this;
153*8975f5c5SAndroid Build Coastguard Worker }
154*8975f5c5SAndroid Build Coastguard Worker 
155*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
156*8975f5c5SAndroid Build Coastguard Worker FixedVector<T, N, Storage> &FixedVector<T, N, Storage>::operator=(
157*8975f5c5SAndroid Build Coastguard Worker     std::initializer_list<value_type> init)
158*8975f5c5SAndroid Build Coastguard Worker {
159*8975f5c5SAndroid Build Coastguard Worker     clear();
160*8975f5c5SAndroid Build Coastguard Worker     ASSERT(init.size() <= N);
161*8975f5c5SAndroid Build Coastguard Worker     assign_from_initializer_list(init);
162*8975f5c5SAndroid Build Coastguard Worker     return *this;
163*8975f5c5SAndroid Build Coastguard Worker }
164*8975f5c5SAndroid Build Coastguard Worker 
165*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
at(size_type pos)166*8975f5c5SAndroid Build Coastguard Worker typename FixedVector<T, N, Storage>::reference FixedVector<T, N, Storage>::at(size_type pos)
167*8975f5c5SAndroid Build Coastguard Worker {
168*8975f5c5SAndroid Build Coastguard Worker     ASSERT(pos < mSize);
169*8975f5c5SAndroid Build Coastguard Worker     return mStorage.at(pos);
170*8975f5c5SAndroid Build Coastguard Worker }
171*8975f5c5SAndroid Build Coastguard Worker 
172*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
at(size_type pos)173*8975f5c5SAndroid Build Coastguard Worker typename FixedVector<T, N, Storage>::const_reference FixedVector<T, N, Storage>::at(
174*8975f5c5SAndroid Build Coastguard Worker     size_type pos) const
175*8975f5c5SAndroid Build Coastguard Worker {
176*8975f5c5SAndroid Build Coastguard Worker     ASSERT(pos < mSize);
177*8975f5c5SAndroid Build Coastguard Worker     return mStorage.at(pos);
178*8975f5c5SAndroid Build Coastguard Worker }
179*8975f5c5SAndroid Build Coastguard Worker 
180*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
181*8975f5c5SAndroid Build Coastguard Worker typename FixedVector<T, N, Storage>::reference FixedVector<T, N, Storage>::operator[](size_type pos)
182*8975f5c5SAndroid Build Coastguard Worker {
183*8975f5c5SAndroid Build Coastguard Worker     ASSERT(pos < mSize);
184*8975f5c5SAndroid Build Coastguard Worker     return mStorage[pos];
185*8975f5c5SAndroid Build Coastguard Worker }
186*8975f5c5SAndroid Build Coastguard Worker 
187*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
188*8975f5c5SAndroid Build Coastguard Worker typename FixedVector<T, N, Storage>::const_reference FixedVector<T, N, Storage>::operator[](
189*8975f5c5SAndroid Build Coastguard Worker     size_type pos) const
190*8975f5c5SAndroid Build Coastguard Worker {
191*8975f5c5SAndroid Build Coastguard Worker     ASSERT(pos < mSize);
192*8975f5c5SAndroid Build Coastguard Worker     return mStorage[pos];
193*8975f5c5SAndroid Build Coastguard Worker }
194*8975f5c5SAndroid Build Coastguard Worker 
195*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
data()196*8975f5c5SAndroid Build Coastguard Worker typename FixedVector<T, N, Storage>::const_pointer angle::FixedVector<T, N, Storage>::data() const
197*8975f5c5SAndroid Build Coastguard Worker {
198*8975f5c5SAndroid Build Coastguard Worker     return mStorage.data();
199*8975f5c5SAndroid Build Coastguard Worker }
200*8975f5c5SAndroid Build Coastguard Worker 
201*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
data()202*8975f5c5SAndroid Build Coastguard Worker typename FixedVector<T, N, Storage>::pointer angle::FixedVector<T, N, Storage>::data()
203*8975f5c5SAndroid Build Coastguard Worker {
204*8975f5c5SAndroid Build Coastguard Worker     return mStorage.data();
205*8975f5c5SAndroid Build Coastguard Worker }
206*8975f5c5SAndroid Build Coastguard Worker 
207*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
begin()208*8975f5c5SAndroid Build Coastguard Worker typename FixedVector<T, N, Storage>::iterator FixedVector<T, N, Storage>::begin()
209*8975f5c5SAndroid Build Coastguard Worker {
210*8975f5c5SAndroid Build Coastguard Worker     return mStorage.begin();
211*8975f5c5SAndroid Build Coastguard Worker }
212*8975f5c5SAndroid Build Coastguard Worker 
213*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
begin()214*8975f5c5SAndroid Build Coastguard Worker typename FixedVector<T, N, Storage>::const_iterator FixedVector<T, N, Storage>::begin() const
215*8975f5c5SAndroid Build Coastguard Worker {
216*8975f5c5SAndroid Build Coastguard Worker     return mStorage.begin();
217*8975f5c5SAndroid Build Coastguard Worker }
218*8975f5c5SAndroid Build Coastguard Worker 
219*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
end()220*8975f5c5SAndroid Build Coastguard Worker typename FixedVector<T, N, Storage>::iterator FixedVector<T, N, Storage>::end()
221*8975f5c5SAndroid Build Coastguard Worker {
222*8975f5c5SAndroid Build Coastguard Worker     return mStorage.begin() + mSize;
223*8975f5c5SAndroid Build Coastguard Worker }
224*8975f5c5SAndroid Build Coastguard Worker 
225*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
end()226*8975f5c5SAndroid Build Coastguard Worker typename FixedVector<T, N, Storage>::const_iterator FixedVector<T, N, Storage>::end() const
227*8975f5c5SAndroid Build Coastguard Worker {
228*8975f5c5SAndroid Build Coastguard Worker     return mStorage.begin() + mSize;
229*8975f5c5SAndroid Build Coastguard Worker }
230*8975f5c5SAndroid Build Coastguard Worker 
231*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
empty()232*8975f5c5SAndroid Build Coastguard Worker bool FixedVector<T, N, Storage>::empty() const
233*8975f5c5SAndroid Build Coastguard Worker {
234*8975f5c5SAndroid Build Coastguard Worker     return mSize == 0;
235*8975f5c5SAndroid Build Coastguard Worker }
236*8975f5c5SAndroid Build Coastguard Worker 
237*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
size()238*8975f5c5SAndroid Build Coastguard Worker typename FixedVector<T, N, Storage>::size_type FixedVector<T, N, Storage>::size() const
239*8975f5c5SAndroid Build Coastguard Worker {
240*8975f5c5SAndroid Build Coastguard Worker     return mSize;
241*8975f5c5SAndroid Build Coastguard Worker }
242*8975f5c5SAndroid Build Coastguard Worker 
243*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
max_size()244*8975f5c5SAndroid Build Coastguard Worker constexpr typename FixedVector<T, N, Storage>::size_type FixedVector<T, N, Storage>::max_size()
245*8975f5c5SAndroid Build Coastguard Worker {
246*8975f5c5SAndroid Build Coastguard Worker     return N;
247*8975f5c5SAndroid Build Coastguard Worker }
248*8975f5c5SAndroid Build Coastguard Worker 
249*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
clear()250*8975f5c5SAndroid Build Coastguard Worker void FixedVector<T, N, Storage>::clear()
251*8975f5c5SAndroid Build Coastguard Worker {
252*8975f5c5SAndroid Build Coastguard Worker     resize(0);
253*8975f5c5SAndroid Build Coastguard Worker }
254*8975f5c5SAndroid Build Coastguard Worker 
255*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
push_back(const value_type & value)256*8975f5c5SAndroid Build Coastguard Worker void FixedVector<T, N, Storage>::push_back(const value_type &value)
257*8975f5c5SAndroid Build Coastguard Worker {
258*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mSize < N);
259*8975f5c5SAndroid Build Coastguard Worker     mStorage[mSize] = value;
260*8975f5c5SAndroid Build Coastguard Worker     mSize++;
261*8975f5c5SAndroid Build Coastguard Worker }
262*8975f5c5SAndroid Build Coastguard Worker 
263*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
push_back(value_type && value)264*8975f5c5SAndroid Build Coastguard Worker void FixedVector<T, N, Storage>::push_back(value_type &&value)
265*8975f5c5SAndroid Build Coastguard Worker {
266*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mSize < N);
267*8975f5c5SAndroid Build Coastguard Worker     mStorage[mSize] = std::move(value);
268*8975f5c5SAndroid Build Coastguard Worker     mSize++;
269*8975f5c5SAndroid Build Coastguard Worker }
270*8975f5c5SAndroid Build Coastguard Worker 
271*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
272*8975f5c5SAndroid Build Coastguard Worker template <class... Args>
emplace_back(Args &&...args)273*8975f5c5SAndroid Build Coastguard Worker void FixedVector<T, N, Storage>::emplace_back(Args &&...args)
274*8975f5c5SAndroid Build Coastguard Worker {
275*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mSize < N);
276*8975f5c5SAndroid Build Coastguard Worker     new (&mStorage[mSize]) T{std::forward<Args>(args)...};
277*8975f5c5SAndroid Build Coastguard Worker     mSize++;
278*8975f5c5SAndroid Build Coastguard Worker }
279*8975f5c5SAndroid Build Coastguard Worker 
280*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
pop_back()281*8975f5c5SAndroid Build Coastguard Worker void FixedVector<T, N, Storage>::pop_back()
282*8975f5c5SAndroid Build Coastguard Worker {
283*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mSize > 0);
284*8975f5c5SAndroid Build Coastguard Worker     mSize--;
285*8975f5c5SAndroid Build Coastguard Worker }
286*8975f5c5SAndroid Build Coastguard Worker 
287*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
back()288*8975f5c5SAndroid Build Coastguard Worker typename FixedVector<T, N, Storage>::reference FixedVector<T, N, Storage>::back()
289*8975f5c5SAndroid Build Coastguard Worker {
290*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mSize > 0);
291*8975f5c5SAndroid Build Coastguard Worker     return mStorage[mSize - 1];
292*8975f5c5SAndroid Build Coastguard Worker }
293*8975f5c5SAndroid Build Coastguard Worker 
294*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
back()295*8975f5c5SAndroid Build Coastguard Worker typename FixedVector<T, N, Storage>::const_reference FixedVector<T, N, Storage>::back() const
296*8975f5c5SAndroid Build Coastguard Worker {
297*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mSize > 0);
298*8975f5c5SAndroid Build Coastguard Worker     return mStorage[mSize - 1];
299*8975f5c5SAndroid Build Coastguard Worker }
300*8975f5c5SAndroid Build Coastguard Worker 
301*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
swap(FixedVector<T,N,Storage> & other)302*8975f5c5SAndroid Build Coastguard Worker void FixedVector<T, N, Storage>::swap(FixedVector<T, N, Storage> &other)
303*8975f5c5SAndroid Build Coastguard Worker {
304*8975f5c5SAndroid Build Coastguard Worker     std::swap(mSize, other.mSize);
305*8975f5c5SAndroid Build Coastguard Worker     std::swap(mStorage, other.mStorage);
306*8975f5c5SAndroid Build Coastguard Worker }
307*8975f5c5SAndroid Build Coastguard Worker 
308*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
resize(size_type count)309*8975f5c5SAndroid Build Coastguard Worker void FixedVector<T, N, Storage>::resize(size_type count)
310*8975f5c5SAndroid Build Coastguard Worker {
311*8975f5c5SAndroid Build Coastguard Worker     ASSERT(count <= N);
312*8975f5c5SAndroid Build Coastguard Worker     while (mSize > count)
313*8975f5c5SAndroid Build Coastguard Worker     {
314*8975f5c5SAndroid Build Coastguard Worker         mSize--;
315*8975f5c5SAndroid Build Coastguard Worker         mStorage[mSize] = value_type();
316*8975f5c5SAndroid Build Coastguard Worker     }
317*8975f5c5SAndroid Build Coastguard Worker     while (mSize < count)
318*8975f5c5SAndroid Build Coastguard Worker     {
319*8975f5c5SAndroid Build Coastguard Worker         mStorage[mSize] = value_type();
320*8975f5c5SAndroid Build Coastguard Worker         mSize++;
321*8975f5c5SAndroid Build Coastguard Worker     }
322*8975f5c5SAndroid Build Coastguard Worker }
323*8975f5c5SAndroid Build Coastguard Worker 
324*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
resize(size_type count,const value_type & value)325*8975f5c5SAndroid Build Coastguard Worker void FixedVector<T, N, Storage>::resize(size_type count, const value_type &value)
326*8975f5c5SAndroid Build Coastguard Worker {
327*8975f5c5SAndroid Build Coastguard Worker     ASSERT(count <= N);
328*8975f5c5SAndroid Build Coastguard Worker     while (mSize > count)
329*8975f5c5SAndroid Build Coastguard Worker     {
330*8975f5c5SAndroid Build Coastguard Worker         mSize--;
331*8975f5c5SAndroid Build Coastguard Worker         mStorage[mSize] = value_type();
332*8975f5c5SAndroid Build Coastguard Worker     }
333*8975f5c5SAndroid Build Coastguard Worker     while (mSize < count)
334*8975f5c5SAndroid Build Coastguard Worker     {
335*8975f5c5SAndroid Build Coastguard Worker         mStorage[mSize] = value;
336*8975f5c5SAndroid Build Coastguard Worker         mSize++;
337*8975f5c5SAndroid Build Coastguard Worker     }
338*8975f5c5SAndroid Build Coastguard Worker }
339*8975f5c5SAndroid Build Coastguard Worker 
340*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
assign_from_initializer_list(std::initializer_list<value_type> init)341*8975f5c5SAndroid Build Coastguard Worker void FixedVector<T, N, Storage>::assign_from_initializer_list(
342*8975f5c5SAndroid Build Coastguard Worker     std::initializer_list<value_type> init)
343*8975f5c5SAndroid Build Coastguard Worker {
344*8975f5c5SAndroid Build Coastguard Worker     for (auto element : init)
345*8975f5c5SAndroid Build Coastguard Worker     {
346*8975f5c5SAndroid Build Coastguard Worker         mStorage[mSize] = std::move(element);
347*8975f5c5SAndroid Build Coastguard Worker         mSize++;
348*8975f5c5SAndroid Build Coastguard Worker     }
349*8975f5c5SAndroid Build Coastguard Worker }
350*8975f5c5SAndroid Build Coastguard Worker 
351*8975f5c5SAndroid Build Coastguard Worker template <class T, size_t N, class Storage>
full()352*8975f5c5SAndroid Build Coastguard Worker bool FixedVector<T, N, Storage>::full() const
353*8975f5c5SAndroid Build Coastguard Worker {
354*8975f5c5SAndroid Build Coastguard Worker     return (mSize == N);
355*8975f5c5SAndroid Build Coastguard Worker }
356*8975f5c5SAndroid Build Coastguard Worker }  // namespace angle
357*8975f5c5SAndroid Build Coastguard Worker 
358*8975f5c5SAndroid Build Coastguard Worker #endif  // COMMON_FIXEDVECTOR_H_
359