@@ -1245,6 +1245,7 @@ pub trait OwnedVector<T> {
1245
1245
1246
1246
fn reserve ( & mut self , n : uint ) ;
1247
1247
fn reserve_at_least ( & mut self , n : uint ) ;
1248
+ fn reserve_additional ( & mut self , n : uint ) ;
1248
1249
fn capacity ( & self ) -> uint ;
1249
1250
fn shrink_to_fit ( & mut self ) ;
1250
1251
@@ -1300,6 +1301,11 @@ impl<T> OwnedVector<T> for ~[T] {
1300
1301
* # Arguments
1301
1302
*
1302
1303
* * n - The number of elements to reserve space for
1304
+ *
1305
+ * # Failure
1306
+ *
1307
+ * This method always succeeds in reserving space for `n` elements, or it does
1308
+ * not return.
1303
1309
*/
1304
1310
fn reserve ( & mut self , n : uint ) {
1305
1311
// Only make the (slow) call into the runtime if we have to
@@ -1340,7 +1346,26 @@ impl<T> OwnedVector<T> for ~[T] {
1340
1346
*/
1341
1347
#[ inline]
1342
1348
fn reserve_at_least ( & mut self , n : uint ) {
1343
- self . reserve ( uint:: next_power_of_two ( n) ) ;
1349
+ self . reserve ( uint:: next_power_of_two_opt ( n) . unwrap_or ( n) ) ;
1350
+ }
1351
+
1352
+ /**
1353
+ * Reserves capacity for at least `n` additional elements in the given vector.
1354
+ *
1355
+ * # Failure
1356
+ *
1357
+ * Fails if the new required capacity overflows uint.
1358
+ *
1359
+ * May also fail if `reserve` fails.
1360
+ */
1361
+ #[ inline]
1362
+ fn reserve_additional ( & mut self , n : uint ) {
1363
+ if self . capacity ( ) - self . len ( ) < n {
1364
+ match self . len ( ) . checked_add ( & n) {
1365
+ None => fail ! ( "vec::reserve_additional: `uint` overflow" ) ,
1366
+ Some ( new_cap) => self . reserve_at_least ( new_cap)
1367
+ }
1368
+ }
1344
1369
}
1345
1370
1346
1371
/// Returns the number of elements the vector can hold without reallocating.
@@ -1376,17 +1401,15 @@ impl<T> OwnedVector<T> for ~[T] {
1376
1401
let repr: * * Box < Vec < ( ) > > = cast:: transmute ( & mut * self ) ;
1377
1402
let fill = ( * * repr) . data . fill ;
1378
1403
if ( * * repr) . data . alloc <= fill {
1379
- let new_len = self . len ( ) + 1 ;
1380
- self . reserve_at_least ( new_len) ;
1404
+ self . reserve_additional ( 1 ) ;
1381
1405
}
1382
1406
1383
1407
push_fast ( self , t) ;
1384
1408
} else {
1385
1409
let repr: * * Vec < ( ) > = cast:: transmute ( & mut * self ) ;
1386
1410
let fill = ( * * repr) . fill ;
1387
1411
if ( * * repr) . alloc <= fill {
1388
- let new_len = self . len ( ) + 1 ;
1389
- self . reserve_at_least ( new_len) ;
1412
+ self . reserve_additional ( 1 ) ;
1390
1413
}
1391
1414
1392
1415
push_fast ( self , t) ;
@@ -1432,7 +1455,7 @@ impl<T> OwnedVector<T> for ~[T] {
1432
1455
let self_len = self . len ( ) ;
1433
1456
let rhs_len = rhs. len ( ) ;
1434
1457
let new_len = self_len + rhs_len;
1435
- self . reserve_at_least ( new_len ) ;
1458
+ self . reserve_additional ( rhs . len ( ) ) ;
1436
1459
unsafe { // Note: infallible.
1437
1460
let self_p = vec:: raw:: to_mut_ptr ( * self ) ;
1438
1461
let rhs_p = vec:: raw:: to_ptr ( rhs) ;
0 commit comments