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