fixed_size_vector_impl.h revision b454fc50edbadc3b212125cabb0503c039aa1d25
1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef CHRE_UTIL_FIXED_SIZE_VECTOR_IMPL_H_
18#define CHRE_UTIL_FIXED_SIZE_VECTOR_IMPL_H_
19
20#include <utility>
21
22#include "chre/platform/assert.h"
23#include "chre/util/fixed_size_vector.h"
24
25namespace chre {
26
27template<typename ElementType, size_t kCapacity>
28ElementType *FixedSizeVector<ElementType, kCapacity>::data() {
29  return reinterpret_cast<ElementType *>(mData);
30}
31
32template<typename ElementType, size_t kCapacity>
33const ElementType *FixedSizeVector<ElementType, kCapacity>::data() const {
34  return reinterpret_cast<const ElementType *>(mData);
35}
36
37template<typename ElementType, size_t kCapacity>
38size_t FixedSizeVector<ElementType, kCapacity>::size() const {
39  return mSize;
40}
41
42template<typename ElementType, size_t kCapacity>
43size_t FixedSizeVector<ElementType, kCapacity>::capacity() const {
44  return kCapacity;
45}
46
47template<typename ElementType, size_t kCapacity>
48bool FixedSizeVector<ElementType, kCapacity>::empty() const {
49  return (mSize == 0);
50}
51
52template<typename ElementType, size_t kCapacity>
53bool FixedSizeVector<ElementType, kCapacity>::full() const {
54  return (mSize == kCapacity);
55}
56
57template<typename ElementType, size_t kCapacity>
58void FixedSizeVector<ElementType, kCapacity>::push_back(
59    const ElementType& element) {
60  CHRE_ASSERT(!full());
61  if (!full()) {
62    data()[mSize++] = element;
63  }
64}
65
66template<typename ElementType, size_t kCapacity>
67template<typename... Args>
68void FixedSizeVector<ElementType, kCapacity>::emplace_back(Args&&... args) {
69  CHRE_ASSERT(!full());
70  if (!full()) {
71    new (&data()[mSize++]) ElementType(std::forward<Args>(args)...);
72  }
73}
74
75template<typename ElementType, size_t kCapacity>
76ElementType& FixedSizeVector<ElementType, kCapacity>::operator[](
77    size_t index) {
78  CHRE_ASSERT(index < mSize);
79  if (index >= mSize) {
80    index = mSize - 1;
81  }
82
83  return data()[index];
84}
85
86template<typename ElementType, size_t kCapacity>
87const ElementType& FixedSizeVector<ElementType, kCapacity>::operator[](
88    size_t index) const {
89  CHRE_ASSERT(index < mSize);
90  if (index >= mSize) {
91    index = mSize - 1;
92  }
93
94  return data()[index];
95}
96
97template<typename ElementType, size_t kCapacity>
98void FixedSizeVector<ElementType, kCapacity>::erase(size_t index) {
99  CHRE_ASSERT(index < mSize);
100  if (index < mSize) {
101    mSize--;
102    for (size_t i = index; i < mSize; i++) {
103      data()[i] = std::move(data()[i + 1]);
104    }
105
106    data()[mSize].~ElementType();
107  }
108}
109
110template<typename ElementType, size_t kCapacity>
111void FixedSizeVector<ElementType, kCapacity>::swap(size_t index0,
112                                                   size_t index1) {
113  CHRE_ASSERT(index0 < mSize && index1 < mSize);
114  if (index0 < mSize && index1 < mSize) {
115    ElementType temp = std::move(data()[index0]);
116    data()[index0] = std::move(data()[index1]);
117    data()[index1] = std::move(temp);
118  }
119}
120
121template<typename ElementType, size_t kCapacity>
122typename FixedSizeVector<ElementType, kCapacity>::iterator
123    FixedSizeVector<ElementType, kCapacity>::begin() {
124  return data();
125}
126
127template<typename ElementType, size_t kCapacity>
128typename FixedSizeVector<ElementType, kCapacity>::iterator
129    FixedSizeVector<ElementType, kCapacity>::end() {
130  return (data() + mSize);
131}
132
133template<typename ElementType, size_t kCapacity>
134typename FixedSizeVector<ElementType, kCapacity>::const_iterator
135    FixedSizeVector<ElementType, kCapacity>::cbegin() const {
136  return data();
137}
138
139template<typename ElementType, size_t kCapacity>
140typename FixedSizeVector<ElementType, kCapacity>::const_iterator
141    FixedSizeVector<ElementType, kCapacity>::cend() const {
142  return (data() + mSize);
143}
144
145template<typename ElementType, size_t kCapacity>
146void FixedSizeVector<ElementType, kCapacity>::resize(size_t newSize) {
147  CHRE_ASSERT(newSize <= kCapacity);
148  if (newSize > kCapacity) {
149    newSize = kCapacity;
150  }
151
152  if (newSize > size()) {
153    for (size_t i = size(); i < newSize; i++) {
154      emplace_back();
155    }
156  } else {
157    for (size_t i = newSize; i < size(); i++) {
158      data()[i].~ElementType();
159    }
160
161    mSize = newSize;
162  }
163}
164
165}  // namespace chre
166
167#endif  // CHRE_UTIL_FIXED_SIZE_VECTOR_IMPL_H_
168