1 /* vim: set ts=4 sw=4 tw=99 et:
3 * Copyright (C) 2012 David Anderson
5 * This file is part of SourcePawn.
7 * SourcePawn is free software: you can redistribute it and/or modify it under
8 * the terms of the GNU General Public License as published by the Free
9 * Software Foundation, either version 3 of the License, or (at your option)
12 * SourcePawn is distributed in the hope that it will be useful, but WITHOUT ANY
13 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along with
17 * SourcePawn. If not, see http://www.gnu.org/licenses/.
19 #ifndef _INCLUDE_KEIMA_TPL_CPP_VECTOR_H_
20 #define _INCLUDE_KEIMA_TPL_CPP_VECTOR_H_
24 #include "AllocatorPolicies.h"
29 template <typename T, typename AllocPolicy = ZoneAllocatorPolicy>
30 class Vector : public AllocPolicy
33 Vector(AllocPolicy = AllocPolicy())
39 for (size_t i = 0; i < nitems; i++)
43 bool append(const T& item) {
46 new (&data[nitems]) T(item);
52 data[nitems - 1].~T();
55 size_t length() const {
62 const T& at(size_t i) const {
66 T& operator [](size_t i) {
69 const T& operator [](size_t i) const {
81 bool GrowIfNeeded(size_t needed)
83 if (!IsUintPtrAddSafe(nitems, needed)) {
84 this->reportAllocationOverflow();
89 while (nitems + needed > maxsize)
91 if (!IsUintPtrMultiplySafe(maxsize, 2)) {
92 this->reportAllocationOverflow();
97 T* newdata = (T*)this->malloc(sizeof(T) * maxsize);
100 for (size_t i = 0; i < nitems; i++)
102 new (&newdata[i]) T(data[i]);
118 #endif /* _INCLUDE_KEIMA_TPL_CPP_VECTOR_H_ */