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