#pragma once
#include <iostream>
#include <cassert>
template <typename T> class Vec {
private:
T *data;
int cap, sz;
void growTo(int newcap);
public:
Vec();
~Vec();
void add(T value);
T get(int idx) const;
T removeLast();
int size() const;
bool isEmpty() const;
friend std::ostream& operator<<(std::ostream& stream, const Vec<T>& v){
stream << "[";
if (v.size() > 0) {
stream << v.get(0);
}
for (int i = 1; i < v.size(); ++i) {
stream << "," << v.get(i);
}
return stream << "]";
}
};
template <typename T> Vec<T>::Vec() {
data = NULL;
cap = 0;
sz = 0;
}
template <typename T> Vec<T>::~Vec() {
delete[] data;
}
template <typename T> void Vec<T>::growTo(int newcap) {
T *newdata = new T[newcap];
for (int i = 0; i < sz; ++i) {
newdata[i] = data[i];
}
delete[] data;
data = newdata;
cap = newcap;
}
template <typename T> void Vec<T>::add(T value) {
if (cap == sz) {
growTo((cap + 1) * 2);
}
data[sz++] = value;
}
template <typename T> T Vec<T>::get(int idx) const {
assert(0 <= idx && idx < sz);
return data[idx];
}
template <typename T> T Vec<T>::removeLast() {
assert(sz > 0);
return data[--sz];
}
template <typename T> int Vec<T>::size() const {
return sz;
}
template <typename T> bool Vec<T>::isEmpty() const {
return sz == 0;
}
//template <typename T> std::ostream& operator<<(std::ostream& stream, const Vec<T>& v) {
// stream << "[";
// if (v.size() > 0) {
// stream << v.get(0);
// }
// for (int i = 1; i < v.size(); ++i) {
// stream << "," << v.get(i);
// }
// return stream << "]";
//}