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