void assign(std::initializer_list<T> other) {
if (other.size() <= size()) {
std::move(other.begin(), other.end(), begin());
erase(cbegin() + other.size(), cend());
ce = cb + other.size();
} else if (other.size() <= ce - ab) {
std::for_each(ce - other.size(), cb, [&](pointer &p){
p = vatraits::allocate(va, 1);
vatraits::construct(va, p, std::move(other.begin()[&p - (ce - other.size())]));
});
std::move(other.end() - size(), other.end(), begin());
cb = ce - other.size();
} else if (other.size() <= ae - ab) {
auto newE = [&](pointer &p){
p = vatraits::allocate(va, 1);
vatraits::construct(va, p, std::move(other.begin()[&p - ab]));
};
std::for_each(ab, cb, newE);
std::move(other.begin() + (cb - ab), other.begin() + (ce - ab), begin());
std::for_each(ce, ab + other.size(), newE);
cb = ab;
ce = ab + other.size();
} else {
pointer *nab = new pointer[other.size() << 1], *ncb = nab + (other.size() >> 1);
std::for_each(ncb, ncb + size(), [&](pointer &p){
p = cb[&p - ncb];
*p = std::move(other.begin()[&p - ncb]);
});
std::for_each(ncb + size(), ncb + other.size(), [&](pointer &p){
p = vatraits::allocate(va, 1);
vatraits::construct(va, p, std::move(other.begin()[&p - ncb]));
});
cb = ncb;
ce = ncb + other.size();
delete []ab;
ab = nab;
ae = nab + (size() << 1);
}
}