std: add reserve_additional and an Extendable impl to Vec.
This commit is contained in:
parent
6e7f170fed
commit
6cb34cf08f
1 changed files with 66 additions and 2 deletions
|
@ -17,11 +17,11 @@ use cmp::{Eq, Ordering, TotalEq, TotalOrd};
|
||||||
use container::Container;
|
use container::Container;
|
||||||
use default::Default;
|
use default::Default;
|
||||||
use fmt;
|
use fmt;
|
||||||
use iter::{DoubleEndedIterator, FromIterator, Iterator};
|
use iter::{DoubleEndedIterator, FromIterator, Extendable, Iterator};
|
||||||
use libc::{free, c_void};
|
use libc::{free, c_void};
|
||||||
use mem::{size_of, move_val_init};
|
use mem::{size_of, move_val_init};
|
||||||
use num;
|
use num;
|
||||||
use num::CheckedMul;
|
use num::{CheckedMul, CheckedAdd};
|
||||||
use ops::Drop;
|
use ops::Drop;
|
||||||
use option::{None, Option, Some};
|
use option::{None, Option, Some};
|
||||||
use ptr::RawPtr;
|
use ptr::RawPtr;
|
||||||
|
@ -126,6 +126,16 @@ impl<T> FromIterator<T> for Vec<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<T> Extendable<T> for Vec<T> {
|
||||||
|
fn extend<I: Iterator<T>>(&mut self, iterator: &mut I) {
|
||||||
|
let (lower, _) = iterator.size_hint();
|
||||||
|
self.reserve_additional(lower);
|
||||||
|
for element in *iterator {
|
||||||
|
self.push(element)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<T:Eq> Eq for Vec<T> {
|
impl<T:Eq> Eq for Vec<T> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn eq(&self, other: &Vec<T>) -> bool {
|
fn eq(&self, other: &Vec<T>) -> bool {
|
||||||
|
@ -160,6 +170,15 @@ impl<T> Vec<T> {
|
||||||
self.cap
|
self.cap
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn reserve_additional(&mut self, extra: uint) {
|
||||||
|
if self.cap - self.len < extra {
|
||||||
|
match self.len.checked_add(&extra) {
|
||||||
|
None => fail!("Vec::reserve_additional: `uint` overflow"),
|
||||||
|
Some(new_cap) => self.reserve(new_cap)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn reserve(&mut self, capacity: uint) {
|
pub fn reserve(&mut self, capacity: uint) {
|
||||||
if capacity >= self.len {
|
if capacity >= self.len {
|
||||||
self.reserve_exact(num::next_power_of_two(capacity))
|
self.reserve_exact(num::next_power_of_two(capacity))
|
||||||
|
@ -453,3 +472,48 @@ impl<T> Drop for MoveItems<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::Vec;
|
||||||
|
use iter::{Iterator, range, Extendable};
|
||||||
|
use option::{Some, None};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_reserve_additional() {
|
||||||
|
let mut v = Vec::new();
|
||||||
|
assert_eq!(v.capacity(), 0);
|
||||||
|
|
||||||
|
v.reserve_additional(2);
|
||||||
|
assert!(v.capacity() >= 2);
|
||||||
|
|
||||||
|
for i in range(0, 16) {
|
||||||
|
v.push(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
assert!(v.capacity() >= 16);
|
||||||
|
v.reserve_additional(16);
|
||||||
|
assert!(v.capacity() >= 32);
|
||||||
|
|
||||||
|
v.push(16);
|
||||||
|
|
||||||
|
v.reserve_additional(16);
|
||||||
|
assert!(v.capacity() >= 33)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_extend() {
|
||||||
|
let mut v = Vec::new();
|
||||||
|
let mut w = Vec::new();
|
||||||
|
|
||||||
|
v.extend(&mut range(0, 3));
|
||||||
|
for i in range(0, 3) { w.push(i) }
|
||||||
|
|
||||||
|
assert_eq!(v, w);
|
||||||
|
|
||||||
|
v.extend(&mut range(3, 10));
|
||||||
|
for i in range(3, 10) { w.push(i) }
|
||||||
|
|
||||||
|
assert_eq!(v, w);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue