46 vec<T>& operator = (vec<T>& other) {
assert(0);
return *
this; }
50 static inline int imax (
int x,
int y) {
int mask = (y-x) >> (
sizeof(
int)*8-1);
return (x&mask) + (y&(~mask)); }
52 static inline void nextCap(
int& cap){ cap += ((cap >> 1) + 2) & ~1; }
56 vec() : data(NULL) , sz(0) , cap(0) { }
62 operator T* (void) {
return data; }
65 int size (
void)
const {
return sz; }
66 void shrink (
int nelems) {
assert(nelems <= sz);
for (
int i = 0; i < nelems; i++) sz--, data[sz].~T(); }
72 void clear (
bool dealloc =
false);
75 void push (
void) {
if (sz == cap)
capacity(sz+1);
new (&data[sz]) T(); sz++; }
76 void push (
const T& elem) {
if (sz == cap)
capacity(sz+1); data[sz++] = elem; }
77 void push_ (
const T& elem) {
assert(sz < cap); data[sz++] = elem; }
78 void pop (
void) {
assert(sz > 0); sz--, data[sz].~T(); }
84 const T&
last (
void)
const {
return data[sz-1]; }
85 T&
last (
void) {
return data[sz-1]; }
88 const T&
operator [] (
int index)
const {
return data[index]; }
92 void copyTo(vec<T>& copy)
const { copy.clear(); copy.growTo(sz);
for (
int i = 0; i < sz; i++) copy[i] = data[i]; }
93 void moveTo(vec<T>& dest) { dest.
clear(
true); dest.data = data; dest.sz = sz; dest.cap = cap; data = NULL; sz = 0; cap = 0; }
98 if (cap >= min_cap)
return;
99 int add = imax((min_cap - cap + 1) & ~1, ((cap >> 1) + 2) & ~1);
100 if (add > INT_MAX - cap || (((data = (T*)
::realloc(data, (cap += add) *
sizeof(T))) == NULL) && errno == ENOMEM))
111 if (sz >=
size)
return;
113 for (
int i = sz; i <
size; i++) data[i] = pad;
119 if (sz >=
size)
return;
121 for (
int i = sz; i <
size; i++)
new (&data[i]) T();
128 for (
int i = 0; i < sz; i++) data[i].~T();
130 if (dealloc)
free(data), data = NULL, cap = 0; } }