fixed_size_vector_impl.h revision 90c04ef3564eb228eebb5da5b21bb80e5e46e299
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 "chre/platform/assert.h" 21#include "chre/util/fixed_size_vector.h" 22 23namespace chre { 24 25template<typename ElementType, size_t kCapacity> 26ElementType *FixedSizeVector<ElementType, kCapacity>::data() { 27 return reinterpret_cast<ElementType *>(mData); 28} 29 30template<typename ElementType, size_t kCapacity> 31const ElementType *FixedSizeVector<ElementType, kCapacity>::data() const { 32 return reinterpret_cast<const ElementType *>(mData); 33} 34 35template<typename ElementType, size_t kCapacity> 36size_t FixedSizeVector<ElementType, kCapacity>::size() const { 37 return mSize; 38} 39 40template<typename ElementType, size_t kCapacity> 41size_t FixedSizeVector<ElementType, kCapacity>::capacity() const { 42 return kCapacity; 43} 44 45template<typename ElementType, size_t kCapacity> 46bool FixedSizeVector<ElementType, kCapacity>::empty() const { 47 return (mSize == 0); 48} 49 50template<typename ElementType, size_t kCapacity> 51bool FixedSizeVector<ElementType, kCapacity>::full() const { 52 return (mSize == kCapacity); 53} 54 55template<typename ElementType, size_t kCapacity> 56void FixedSizeVector<ElementType, kCapacity>::push_back( 57 const ElementType& element) { 58 CHRE_ASSERT(!full()); 59 if (!full()) { 60 data()[mSize++] = element; 61 } 62} 63 64template<typename ElementType, size_t kCapacity> 65template<typename... Args> 66void FixedSizeVector<ElementType, kCapacity>::emplace_back(Args&&... args) { 67 CHRE_ASSERT(!full()); 68 if (!full()) { 69 new (&data()[mSize++]) ElementType(std::forward<Args>(args)...); 70 } 71} 72 73template<typename ElementType, size_t kCapacity> 74ElementType& FixedSizeVector<ElementType, kCapacity>::operator[]( 75 size_t index) { 76 CHRE_ASSERT(index < mSize); 77 if (index >= mSize) { 78 index = mSize - 1; 79 } 80 81 return data()[index]; 82} 83 84template<typename ElementType, size_t kCapacity> 85const ElementType& FixedSizeVector<ElementType, kCapacity>::operator[]( 86 size_t index) const { 87 CHRE_ASSERT(index < mSize); 88 if (index >= mSize) { 89 index = mSize - 1; 90 } 91 92 return data()[index]; 93} 94 95template<typename ElementType, size_t kCapacity> 96void FixedSizeVector<ElementType, kCapacity>::erase(size_t index) { 97 CHRE_ASSERT(index < mSize); 98 if (index < mSize) { 99 mSize--; 100 for (size_t i = index; i < mSize; i++) { 101 data()[i] = std::move(data()[i + 1]); 102 } 103 104 data()[mSize].~ElementType(); 105 } 106} 107 108template<typename ElementType, size_t kCapacity> 109void FixedSizeVector<ElementType, kCapacity>::swap(size_t index0, 110 size_t index1) { 111 CHRE_ASSERT(index0 < mSize && index1 < mSize); 112 if (index0 < mSize && index1 < mSize) { 113 ElementType temp = std::move(data()[index0]); 114 data()[index0] = std::move(data()[index1]); 115 data()[index1] = std::move(temp); 116 } 117} 118 119template<typename ElementType, size_t kCapacity> 120typename FixedSizeVector<ElementType, kCapacity>::iterator 121 FixedSizeVector<ElementType, kCapacity>::begin() { 122 return data(); 123} 124 125template<typename ElementType, size_t kCapacity> 126typename FixedSizeVector<ElementType, kCapacity>::iterator 127 FixedSizeVector<ElementType, kCapacity>::end() { 128 return (data() + mSize); 129} 130 131template<typename ElementType, size_t kCapacity> 132typename FixedSizeVector<ElementType, kCapacity>::const_iterator 133 FixedSizeVector<ElementType, kCapacity>::begin() const { 134 return data(); 135} 136 137template<typename ElementType, size_t kCapacity> 138typename FixedSizeVector<ElementType, kCapacity>::const_iterator 139 FixedSizeVector<ElementType, kCapacity>::end() const { 140 return (data() + mSize); 141} 142 143} // namespace chre 144 145#endif // CHRE_UTIL_FIXED_SIZE_VECTOR_IMPL_H_ 146