Refactor compilation process around the new concept of packages.
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);
50 void infallibleAppend(const T &item) {
51 assert(GrowIfNeeded(1));
52 new (&data[nitems]) T(item);
56 T t = at(length() - 1);
62 data[nitems - 1].~T();
68 size_t length() const {
75 const T& at(size_t i) const {
79 T& operator [](size_t i) {
82 const T& operator [](size_t i) const {
93 bool ensure(size_t desired) {
94 if (desired <= length())
97 return GrowIfNeeded(desired - length());
101 bool GrowIfNeeded(size_t needed)
103 if (!IsUintPtrAddSafe(nitems, needed)) {
104 this->reportAllocationOverflow();
109 while (nitems + needed > maxsize) {
110 if (!IsUintPtrMultiplySafe(maxsize, 2)) {
111 this->reportAllocationOverflow();
116 T* newdata = (T*)this->malloc(sizeof(T) * maxsize);
119 for (size_t i = 0; i < nitems; i++) {
120 new (&newdata[i]) T(data[i]);
136 #endif /* _INCLUDE_KEIMA_TPL_CPP_VECTOR_H_ */