From 7a7ae993ce694bf75a11632b394916e055a4d8ec Mon Sep 17 00:00:00 2001 From: Andrew Poelstra Date: Mon, 30 Jun 2014 13:05:05 -0700 Subject: [PATCH] collections::bitv: correct use of Vec::grow The argument passed to Vec::grow is the number of elements to grow the vector by, not the target number of elements. The old `Bitv` code did the wrong thing, allocating more memory than it needed to. --- src/libcollections/bitv.rs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/libcollections/bitv.rs b/src/libcollections/bitv.rs index b480b88b4d4f..18e3390dff52 100644 --- a/src/libcollections/bitv.rs +++ b/src/libcollections/bitv.rs @@ -515,9 +515,10 @@ impl BitvSet { /// Grows the vector to be able to store bits with indices `[0, size - 1]` fn grow(&mut self, size: uint) { let &BitvSet(ref mut bitv) = self; + let old_size = bitv.storage.len(); let size = (size + uint::BITS - 1) / uint::BITS; - if bitv.storage.len() < size { - bitv.storage.grow(size, &0); + if old_size < size { + bitv.storage.grow(size - old_size, &0); } } @@ -1253,14 +1254,22 @@ mod tests { #[test] fn test_bitv_set_basic() { + // calculate nbits with uint::BITS granularity + fn calc_nbits(bits: uint) -> uint { + uint::BITS * ((bits + uint::BITS - 1) / uint::BITS) + } + let mut b = BitvSet::new(); + assert_eq!(b.capacity(), calc_nbits(0)); assert!(b.insert(3)); + assert_eq!(b.capacity(), calc_nbits(3)); assert!(!b.insert(3)); assert!(b.contains(&3)); assert!(b.insert(4)); assert!(!b.insert(4)); assert!(b.contains(&3)); assert!(b.insert(400)); + assert_eq!(b.capacity(), calc_nbits(400)); assert!(!b.insert(400)); assert!(b.contains(&400)); assert_eq!(b.len(), 3);