@@ -17,11 +17,11 @@ use cmp::{Eq, Ordering, TotalEq, TotalOrd};
17
17
use container:: Container ;
18
18
use default:: Default ;
19
19
use fmt;
20
- use iter:: { DoubleEndedIterator , FromIterator , Iterator } ;
20
+ use iter:: { DoubleEndedIterator , FromIterator , Extendable , Iterator } ;
21
21
use libc:: { free, c_void} ;
22
22
use mem:: { size_of, move_val_init} ;
23
23
use num;
24
- use num:: CheckedMul ;
24
+ use num:: { CheckedMul , CheckedAdd } ;
25
25
use ops:: Drop ;
26
26
use option:: { None , Option , Some } ;
27
27
use ptr:: RawPtr ;
@@ -126,6 +126,16 @@ impl<T> FromIterator<T> for Vec<T> {
126
126
}
127
127
}
128
128
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
+
129
139
impl < T : Eq > Eq for Vec < T > {
130
140
#[ inline]
131
141
fn eq ( & self , other : & Vec < T > ) -> bool {
@@ -160,6 +170,15 @@ impl<T> Vec<T> {
160
170
self . cap
161
171
}
162
172
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
+
163
182
pub fn reserve ( & mut self , capacity : uint ) {
164
183
if capacity >= self . len {
165
184
self . reserve_exact ( num:: next_power_of_two ( capacity) )
@@ -453,3 +472,48 @@ impl<T> Drop for MoveItems<T> {
453
472
}
454
473
}
455
474
}
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