if(size != d->length) {
detach();
- const size_t bufferSize = d->data->data.size();
+ // Remove the excessive length of the internal buffer first to pad correctly.
+ // This doesn't reallocate the buffer, since std::vector::resize() doesn't
+ // reallocate the buffer when shrinking.
- if(size > bufferSize - d->offset) {
- d->data->data.resize(d->offset + size, padding);
- ::memset(&*end(), padding, bufferSize - (d->length + d->offset));
- }
- else if(size > d->length) {
- ::memset(&*end(), padding, size - d->length);
- }
+ d->data->data.resize(d->offset + d->length);
+ d->data->data.resize(d->offset + size, padding);
d->length = size;
}