@@ -17,11 +17,11 @@ use cmp::{Eq, Ordering, TotalEq, TotalOrd};
1717use container:: Container ;
1818use default:: Default ;
1919use fmt;
20- use iter:: { DoubleEndedIterator , FromIterator , Iterator } ;
20+ use iter:: { DoubleEndedIterator , FromIterator , Extendable , Iterator } ;
2121use libc:: { free, c_void} ;
2222use mem:: { size_of, move_val_init} ;
2323use num;
24- use num:: CheckedMul ;
24+ use num:: { CheckedMul , CheckedAdd } ;
2525use ops:: Drop ;
2626use option:: { None , Option , Some } ;
2727use ptr:: RawPtr ;
@@ -126,6 +126,16 @@ impl<T> FromIterator<T> for Vec<T> {
126126 }
127127}
128128
129+ impl < T > Extendable < T > for Vec < T > {
130+ fn extend < I : Iterator < T > > ( & mut self , iterator : & mut I ) {
131+ let ( lower, _) = iterator. size_hint ( ) ;
132+ self . reserve_additional ( lower) ;
133+ for element in * iterator {
134+ self . push ( element)
135+ }
136+ }
137+ }
138+
129139impl < T : Eq > Eq for Vec < T > {
130140 #[ inline]
131141 fn eq ( & self , other : & Vec < T > ) -> bool {
@@ -160,6 +170,15 @@ impl<T> Vec<T> {
160170 self . cap
161171 }
162172
173+ pub fn reserve_additional ( & mut self , extra : uint ) {
174+ if self . cap - self . len < extra {
175+ match self . len . checked_add ( & extra) {
176+ None => fail ! ( "Vec::reserve_additional: `uint` overflow" ) ,
177+ Some ( new_cap) => self . reserve ( new_cap)
178+ }
179+ }
180+ }
181+
163182 pub fn reserve ( & mut self , capacity : uint ) {
164183 if capacity >= self . len {
165184 self . reserve_exact ( num:: next_power_of_two ( capacity) )
@@ -453,3 +472,48 @@ impl<T> Drop for MoveItems<T> {
453472 }
454473 }
455474}
475+
476+ #[ cfg( test) ]
477+ mod tests {
478+ use super :: Vec ;
479+ use iter:: { Iterator , range, Extendable } ;
480+ use option:: { Some , None } ;
481+
482+ #[ test]
483+ fn test_reserve_additional ( ) {
484+ let mut v = Vec :: new ( ) ;
485+ assert_eq ! ( v. capacity( ) , 0 ) ;
486+
487+ v. reserve_additional ( 2 ) ;
488+ assert ! ( v. capacity( ) >= 2 ) ;
489+
490+ for i in range ( 0 , 16 ) {
491+ v. push ( i) ;
492+ }
493+
494+ assert ! ( v. capacity( ) >= 16 ) ;
495+ v. reserve_additional ( 16 ) ;
496+ assert ! ( v. capacity( ) >= 32 ) ;
497+
498+ v. push ( 16 ) ;
499+
500+ v. reserve_additional ( 16 ) ;
501+ assert ! ( v. capacity( ) >= 33 )
502+ }
503+
504+ #[ test]
505+ fn test_extend ( ) {
506+ let mut v = Vec :: new ( ) ;
507+ let mut w = Vec :: new ( ) ;
508+
509+ v. extend ( & mut range ( 0 , 3 ) ) ;
510+ for i in range ( 0 , 3 ) { w. push ( i) }
511+
512+ assert_eq ! ( v, w) ;
513+
514+ v. extend ( & mut range ( 3 , 10 ) ) ;
515+ for i in range ( 3 , 10 ) { w. push ( i) }
516+
517+ assert_eq ! ( v, w) ;
518+ }
519+ }
0 commit comments