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(); }
74 void clear (
bool dealloc =
false);
77 void push (
void) {
if (sz == cap)
capacity(sz+1);
new (&data[sz]) T(); sz++; }
78 void push (
const T& elem) {
if (sz == cap)
capacity(sz+1); data[sz++] = elem; }
79 void push_ (
const T& elem) {
assert(sz < cap); data[sz++] = elem; }
80 void pop (
void) {
assert(sz > 0); sz--, data[sz].~T(); }
86 const T&
last (
void)
const {
return data[sz-1]; }
87 T&
last (
void) {
return data[sz-1]; }
90 const T&
operator [] (
int index)
const {
return data[index]; }
94 void copyTo (vec<T>& copy)
const { copy.clear(); copy.growTo(sz);
for (
int i = 0; i < sz; i++) copy[i] = data[i]; }
95 void copyTo_(vec<T>& copy)
const { copy.shrink_(copy.size()); copy.growTo_(sz);
for (
int i = 0; i < sz; i++) copy[i] = data[i]; }
96 void moveTo(vec<T>& dest) { dest.
clear(
true); dest.data = data; dest.sz = sz; dest.cap = cap; data = NULL; sz = 0; cap = 0; }
102 if (cap >= min_cap)
return;
103 int add = imax((min_cap - cap + 1) & ~1, ((cap >> 1) + 2) & ~1);
104 if (add > INT_MAX - cap || (((data = (T*)
::realloc((
void*)data, (cap += add) *
sizeof(T))) == NULL) && errno == ENOMEM))
105 fatal_out_of_memory();
110 if (cap >= ext_cap)
return;
111 if (ext_cap > INT_MAX || (((data = (T*)
::realloc((
void*)data, ext_cap *
sizeof(T))) == NULL) && errno == ENOMEM))
112 fatal_out_of_memory();;
119 if (sz >=
size)
return;
121 for (
int i = sz; i <
size; i++) data[i] = pad;
127 if (sz >=
size)
return;
129 for (
int i = sz; i <
size; i++)
new (&data[i]) T();
135 if (sz >=
size)
return;
143 for (
int i = 0; i < sz; i++) data[i].~T();
145 if (dealloc)
free(data), data = NULL, cap = 0; } }
#define ABC_NAMESPACE_CXX_HEADER_START
#define ABC_NAMESPACE_CXX_HEADER_END
const T & last(void) const
void moveTo(vec< T > &dest)
const T & operator[](int index) const
void capacity(int min_cap)
void copyTo_(vec< T > ©) const
void push_(const T &elem)
void clear(bool dealloc=false)
void prelocate(int ext_cap)
vec(int size, const T &pad)
void copyTo(vec< T > ©) const
void growTo(int size, const T &pad)