29#pragma GCC visibility push(default)
49 static inline int imax (
int x,
int y) {
int mask = (y-x) >> (
sizeof(
int)*8-1);
return (x&mask) + (y&(~mask)); }
61 operator T* (void) {
return data; }
65 void shrink (
int nelems) { assert(nelems <=
sz);
for (
int i = 0; i < nelems; i++)
sz--,
data[
sz].~T(); }
66 void shrink_ (
int nelems) { assert(nelems <=
sz);
sz -= nelems; }
71 void clear (
bool dealloc =
false);
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))) ==
nullptr) && errno == ENOMEM))
107 if (sz >= size)
return;
109 for (
int i = sz; i < size; i++) data[i] = pad;
115 if (sz >= size)
return;
117 for (
int i = sz; i < size; i++)
new (&data[i]) T;
123 if (data !=
nullptr){
124 for (
int i = 0; i < sz; i++) data[i].~T();
126 if (dealloc) free(data), data =
nullptr, cap = 0;
133#pragma GCC visibility pop
const T & operator[](int index) const
void growTo(int size, const T &pad)
static void nextCap(int &cap)
void clear(bool dealloc=false)
static int imax(int x, int y)
void moveTo(vec< T > &dest)
void capacity(int min_cap)
vec(int size, const T &pad)
vec< T > & operator=(vec< T > &other)
void copyTo(vec< T > ©) const
void push_(const T &elem)
const T & last(void) const
static void copy(const T &from, T &to)