1
Fork 0

Clarified and simplified algorithm for increasing size of buffer in

read_to_end()
This commit is contained in:
bcoopers 2015-03-29 19:08:53 -04:00
parent 92f3d9a6b4
commit 45c10db41f

View file

@ -101,15 +101,14 @@ fn append_to_string<F>(buf: &mut String, f: F) -> Result<usize>
fn read_to_end<R: Read + ?Sized>(r: &mut R, buf: &mut Vec<u8>) -> Result<usize> { fn read_to_end<R: Read + ?Sized>(r: &mut R, buf: &mut Vec<u8>) -> Result<usize> {
let start_len = buf.len(); let start_len = buf.len();
let mut len = start_len; let mut len = start_len;
let mut cap_bump = 16; let min_cap_bump = 16;
let ret; let ret;
loop { loop {
if len == buf.len() { if len == buf.len() {
if buf.capacity() == buf.len() { if buf.capacity() == buf.len() {
if cap_bump < DEFAULT_BUF_SIZE { // reserve() rounds up our request to the nearest power of two, so after the first
cap_bump *= 2; // time the capacity is exceeded, we double our capacity at each call to reserve.
} buf.reserve(min_cap_bump);
buf.reserve(cap_bump);
} }
let new_area = buf.capacity() - buf.len(); let new_area = buf.capacity() - buf.len();
buf.extend(iter::repeat(0).take(new_area)); buf.extend(iter::repeat(0).take(new_area));