1736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol/* 2736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol * Copyright (C) 2016 The Android Open Source Project 3736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol * 4736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol * Licensed under the Apache License, Version 2.0 (the "License"); 5736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol * you may not use this file except in compliance with the License. 6736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol * You may obtain a copy of the License at 7736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol * 8736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol * http://www.apache.org/licenses/LICENSE-2.0 9736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol * 10736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol * Unless required by applicable law or agreed to in writing, software 11736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol * distributed under the License is distributed on an "AS IS" BASIS, 12736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol * See the License for the specific language governing permissions and 14736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol * limitations under the License. 15736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol */ 16736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol 17736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol#ifndef CHRE_UTIL_FIXED_SIZE_VECTOR_IMPL_H_ 18736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol#define CHRE_UTIL_FIXED_SIZE_VECTOR_IMPL_H_ 19736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol 208be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie#include <new> 21b454fc50edbadc3b212125cabb0503c039aa1d25Andrew Rossignol 22736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol#include "chre/platform/assert.h" 238be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie#include "chre/util/memory.h" 24736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol 25736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignolnamespace chre { 26736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol 27736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignoltemplate<typename ElementType, size_t kCapacity> 284849d809e7b9691e5968923d546c8be7547e4386Meng-hsuan ChungFixedSizeVector<ElementType, kCapacity>::~FixedSizeVector() { 294849d809e7b9691e5968923d546c8be7547e4386Meng-hsuan Chung destroy(data(), size()); 304849d809e7b9691e5968923d546c8be7547e4386Meng-hsuan Chung} 314849d809e7b9691e5968923d546c8be7547e4386Meng-hsuan Chung 324849d809e7b9691e5968923d546c8be7547e4386Meng-hsuan Chungtemplate<typename ElementType, size_t kCapacity> 33090c2796acebb647a98c48a007c7b2bb151f1e50Brian DuddieElementType& FixedSizeVector<ElementType, kCapacity>::back() { 34090c2796acebb647a98c48a007c7b2bb151f1e50Brian Duddie CHRE_ASSERT(mSize > 0); 35090c2796acebb647a98c48a007c7b2bb151f1e50Brian Duddie return data()[mSize - 1]; 36090c2796acebb647a98c48a007c7b2bb151f1e50Brian Duddie} 37090c2796acebb647a98c48a007c7b2bb151f1e50Brian Duddie 38090c2796acebb647a98c48a007c7b2bb151f1e50Brian Duddietemplate<typename ElementType, size_t kCapacity> 39090c2796acebb647a98c48a007c7b2bb151f1e50Brian Duddieconst ElementType& FixedSizeVector<ElementType, kCapacity>::back() const { 40090c2796acebb647a98c48a007c7b2bb151f1e50Brian Duddie CHRE_ASSERT(mSize > 0); 41090c2796acebb647a98c48a007c7b2bb151f1e50Brian Duddie return data()[mSize - 1]; 42090c2796acebb647a98c48a007c7b2bb151f1e50Brian Duddie} 43090c2796acebb647a98c48a007c7b2bb151f1e50Brian Duddie 44090c2796acebb647a98c48a007c7b2bb151f1e50Brian Duddietemplate<typename ElementType, size_t kCapacity> 45090c2796acebb647a98c48a007c7b2bb151f1e50Brian DuddieElementType& FixedSizeVector<ElementType, kCapacity>::front() { 46090c2796acebb647a98c48a007c7b2bb151f1e50Brian Duddie CHRE_ASSERT(mSize > 0); 47090c2796acebb647a98c48a007c7b2bb151f1e50Brian Duddie return data()[0]; 48090c2796acebb647a98c48a007c7b2bb151f1e50Brian Duddie} 49090c2796acebb647a98c48a007c7b2bb151f1e50Brian Duddie 50090c2796acebb647a98c48a007c7b2bb151f1e50Brian Duddietemplate<typename ElementType, size_t kCapacity> 51090c2796acebb647a98c48a007c7b2bb151f1e50Brian Duddieconst ElementType& FixedSizeVector<ElementType, kCapacity>::front() const { 52090c2796acebb647a98c48a007c7b2bb151f1e50Brian Duddie CHRE_ASSERT(mSize > 0); 53090c2796acebb647a98c48a007c7b2bb151f1e50Brian Duddie return data()[0]; 54090c2796acebb647a98c48a007c7b2bb151f1e50Brian Duddie} 55090c2796acebb647a98c48a007c7b2bb151f1e50Brian Duddie 56090c2796acebb647a98c48a007c7b2bb151f1e50Brian Duddietemplate<typename ElementType, size_t kCapacity> 57736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew RossignolElementType *FixedSizeVector<ElementType, kCapacity>::data() { 58736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol return reinterpret_cast<ElementType *>(mData); 59736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol} 60736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol 61736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignoltemplate<typename ElementType, size_t kCapacity> 62736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignolconst ElementType *FixedSizeVector<ElementType, kCapacity>::data() const { 63736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol return reinterpret_cast<const ElementType *>(mData); 64736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol} 65736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol 66736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignoltemplate<typename ElementType, size_t kCapacity> 67736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignolsize_t FixedSizeVector<ElementType, kCapacity>::size() const { 68736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol return mSize; 69736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol} 70736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol 71736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignoltemplate<typename ElementType, size_t kCapacity> 72736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignolsize_t FixedSizeVector<ElementType, kCapacity>::capacity() const { 73736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol return kCapacity; 74736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol} 75736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol 76736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignoltemplate<typename ElementType, size_t kCapacity> 77736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignolbool FixedSizeVector<ElementType, kCapacity>::empty() const { 78736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol return (mSize == 0); 79736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol} 80736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol 81736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignoltemplate<typename ElementType, size_t kCapacity> 82736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignolbool FixedSizeVector<ElementType, kCapacity>::full() const { 83736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol return (mSize == kCapacity); 84736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol} 85736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol 86736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignoltemplate<typename ElementType, size_t kCapacity> 87736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignolvoid FixedSizeVector<ElementType, kCapacity>::push_back( 88736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol const ElementType& element) { 89926f1b91231f88c3669f10dec8f56e24ae16b957Andrew Rossignol CHRE_ASSERT(!full()); 90736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol if (!full()) { 918be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie new (&data()[mSize++]) ElementType(element); 92736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol } 93736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol} 94736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol 95736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignoltemplate<typename ElementType, size_t kCapacity> 964927ee586656424c827920876673228fbdcf27c3Andrew Rossignoltemplate<typename... Args> 974927ee586656424c827920876673228fbdcf27c3Andrew Rossignolvoid FixedSizeVector<ElementType, kCapacity>::emplace_back(Args&&... args) { 98926f1b91231f88c3669f10dec8f56e24ae16b957Andrew Rossignol CHRE_ASSERT(!full()); 994927ee586656424c827920876673228fbdcf27c3Andrew Rossignol if (!full()) { 1004927ee586656424c827920876673228fbdcf27c3Andrew Rossignol new (&data()[mSize++]) ElementType(std::forward<Args>(args)...); 1014927ee586656424c827920876673228fbdcf27c3Andrew Rossignol } 1024927ee586656424c827920876673228fbdcf27c3Andrew Rossignol} 1034927ee586656424c827920876673228fbdcf27c3Andrew Rossignol 1044927ee586656424c827920876673228fbdcf27c3Andrew Rossignoltemplate<typename ElementType, size_t kCapacity> 105736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew RossignolElementType& FixedSizeVector<ElementType, kCapacity>::operator[]( 106736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol size_t index) { 107926f1b91231f88c3669f10dec8f56e24ae16b957Andrew Rossignol CHRE_ASSERT(index < mSize); 108736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol if (index >= mSize) { 109736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol index = mSize - 1; 110736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol } 111736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol 112736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol return data()[index]; 113736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol} 114736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol 115736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignoltemplate<typename ElementType, size_t kCapacity> 116736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignolconst ElementType& FixedSizeVector<ElementType, kCapacity>::operator[]( 117736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol size_t index) const { 118926f1b91231f88c3669f10dec8f56e24ae16b957Andrew Rossignol CHRE_ASSERT(index < mSize); 119736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol if (index >= mSize) { 120736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol index = mSize - 1; 121736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol } 122736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol 123736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol return data()[index]; 124736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol} 125736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol 12612048259ea9203bccb00460b821a40731249f1e2Meng-hsuan Chungtemplate<typename ElementType, size_t kCapacity> 12712048259ea9203bccb00460b821a40731249f1e2Meng-hsuan Chungvoid FixedSizeVector<ElementType, kCapacity>::erase(size_t index) { 12812048259ea9203bccb00460b821a40731249f1e2Meng-hsuan Chung CHRE_ASSERT(index < mSize); 12912048259ea9203bccb00460b821a40731249f1e2Meng-hsuan Chung if (index < mSize) { 13012048259ea9203bccb00460b821a40731249f1e2Meng-hsuan Chung mSize--; 13112048259ea9203bccb00460b821a40731249f1e2Meng-hsuan Chung for (size_t i = index; i < mSize; i++) { 1328be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie moveOrCopyAssign(data()[i], data()[i + 1]); 13312048259ea9203bccb00460b821a40731249f1e2Meng-hsuan Chung } 13412048259ea9203bccb00460b821a40731249f1e2Meng-hsuan Chung 13512048259ea9203bccb00460b821a40731249f1e2Meng-hsuan Chung data()[mSize].~ElementType(); 13612048259ea9203bccb00460b821a40731249f1e2Meng-hsuan Chung } 13712048259ea9203bccb00460b821a40731249f1e2Meng-hsuan Chung} 13812048259ea9203bccb00460b821a40731249f1e2Meng-hsuan Chung 13912048259ea9203bccb00460b821a40731249f1e2Meng-hsuan Chungtemplate<typename ElementType, size_t kCapacity> 14012048259ea9203bccb00460b821a40731249f1e2Meng-hsuan Chungvoid FixedSizeVector<ElementType, kCapacity>::swap(size_t index0, 14112048259ea9203bccb00460b821a40731249f1e2Meng-hsuan Chung size_t index1) { 14212048259ea9203bccb00460b821a40731249f1e2Meng-hsuan Chung CHRE_ASSERT(index0 < mSize && index1 < mSize); 1431a16de2440b92ac60a94029589a20f92011b6841Brian Duddie if (index0 < mSize && index1 < mSize && index0 != index1) { 1448be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie typename std::aligned_storage<sizeof(ElementType), 1458be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie alignof(ElementType)>::type tempStorage; 1468be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie ElementType& temp = *reinterpret_cast<ElementType *>(&tempStorage); 1478be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie uninitializedMoveOrCopy(&data()[index0], 1, &temp); 1488be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie moveOrCopyAssign(data()[index0], data()[index1]); 1498be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie moveOrCopyAssign(data()[index1], temp); 150021aae0ed1c9ff80d9ffef6b1114f030138c25d2Meng-hsuan Chung } 15112048259ea9203bccb00460b821a40731249f1e2Meng-hsuan Chung} 15212048259ea9203bccb00460b821a40731249f1e2Meng-hsuan Chung 15390c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chungtemplate<typename ElementType, size_t kCapacity> 15490c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chungtypename FixedSizeVector<ElementType, kCapacity>::iterator 15590c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chung FixedSizeVector<ElementType, kCapacity>::begin() { 15690c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chung return data(); 15790c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chung} 15890c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chung 15990c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chungtemplate<typename ElementType, size_t kCapacity> 16090c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chungtypename FixedSizeVector<ElementType, kCapacity>::iterator 16190c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chung FixedSizeVector<ElementType, kCapacity>::end() { 16290c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chung return (data() + mSize); 16390c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chung} 16490c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chung 16590c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chungtemplate<typename ElementType, size_t kCapacity> 16690c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chungtypename FixedSizeVector<ElementType, kCapacity>::const_iterator 16748080e341c2a12db12deb086adce1d487a759141Meng-hsuan Chung FixedSizeVector<ElementType, kCapacity>::begin() const { 16848080e341c2a12db12deb086adce1d487a759141Meng-hsuan Chung return cbegin(); 16948080e341c2a12db12deb086adce1d487a759141Meng-hsuan Chung} 17048080e341c2a12db12deb086adce1d487a759141Meng-hsuan Chung 17148080e341c2a12db12deb086adce1d487a759141Meng-hsuan Chungtemplate<typename ElementType, size_t kCapacity> 17248080e341c2a12db12deb086adce1d487a759141Meng-hsuan Chungtypename FixedSizeVector<ElementType, kCapacity>::const_iterator 17348080e341c2a12db12deb086adce1d487a759141Meng-hsuan Chung FixedSizeVector<ElementType, kCapacity>::end() const { 17448080e341c2a12db12deb086adce1d487a759141Meng-hsuan Chung return cend(); 17548080e341c2a12db12deb086adce1d487a759141Meng-hsuan Chung} 17648080e341c2a12db12deb086adce1d487a759141Meng-hsuan Chung 17748080e341c2a12db12deb086adce1d487a759141Meng-hsuan Chungtemplate<typename ElementType, size_t kCapacity> 17848080e341c2a12db12deb086adce1d487a759141Meng-hsuan Chungtypename FixedSizeVector<ElementType, kCapacity>::const_iterator 179e1129bcc6fb320fd1752cd6c900ead2a0595c761Meng-hsuan Chung FixedSizeVector<ElementType, kCapacity>::cbegin() const { 18090c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chung return data(); 18190c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chung} 18290c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chung 18390c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chungtemplate<typename ElementType, size_t kCapacity> 18490c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chungtypename FixedSizeVector<ElementType, kCapacity>::const_iterator 185e1129bcc6fb320fd1752cd6c900ead2a0595c761Meng-hsuan Chung FixedSizeVector<ElementType, kCapacity>::cend() const { 18690c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chung return (data() + mSize); 18790c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chung} 18890c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chung 1897f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignoltemplate<typename ElementType, size_t kCapacity> 1907f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignolvoid FixedSizeVector<ElementType, kCapacity>::resize(size_t newSize) { 1917f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol CHRE_ASSERT(newSize <= kCapacity); 1927f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol if (newSize > kCapacity) { 1937f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol newSize = kCapacity; 1947f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol } 1957f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol 1967f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol if (newSize > size()) { 1977f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol for (size_t i = size(); i < newSize; i++) { 1987f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol emplace_back(); 1997f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol } 2007f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol } else { 2017f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol for (size_t i = newSize; i < size(); i++) { 2027f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol data()[i].~ElementType(); 2037f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol } 2047f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol 2057f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol mSize = newSize; 2067f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol } 2077f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol} 2087f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol 209736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol} // namespace chre 210736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol 211736620171d63e1f0c0be70f9c27e2679fca5eaadAndrew Rossignol#endif // CHRE_UTIL_FIXED_SIZE_VECTOR_IMPL_H_ 212