@@ -1091,9 +1091,7 @@ pub trait OwnedVector<T> {
1091
1091
1092
1092
fn push_all_move( & mut self , rhs: ~[ T ] ) ;
1093
1093
fn pop( & mut self ) -> T ;
1094
- fn pop_opt( & mut self ) -> Option <T >;
1095
1094
fn shift( & mut self ) -> T ;
1096
- fn shift_opt( & mut self ) -> Option <T >;
1097
1095
fn unshift( & mut self , x: T ) ;
1098
1096
fn insert( & mut self , i: uint, x: T ) ;
1099
1097
fn remove( & mut self , i: uint) -> T ;
@@ -1283,49 +1281,35 @@ impl<T> OwnedVector<T> for ~[T] {
1283
1281
}
1284
1282
}
1285
1283
1286
- /// Remove the last element from a vector and return it, or `None` if it is empty
1287
- fn pop_opt( & mut self ) -> Option <T > {
1288
- match self . len( ) {
1289
- 0 => None ,
1290
- ln => {
1291
- let valptr = ptr:: to_mut_unsafe_ptr( & mut self [ ln - 1 u] ) ;
1292
- unsafe {
1293
- let val = ptr:: replace_ptr( valptr, intrinsics:: init( ) ) ;
1294
- raw :: set_len( self , ln - 1 u) ;
1295
- Some ( val)
1296
- }
1297
- }
1298
- }
1299
- }
1300
-
1301
-
1302
- /// Remove the last element from a vector and return it, failing if it is empty
1303
- #[ inline]
1284
+ /// Remove the last element from a vector and return it
1304
1285
fn pop( & mut self ) -> T {
1305
- self . pop_opt( ) . expect( "pop: empty vector")
1286
+ let ln = self . len( ) ;
1287
+ if ln == 0 {
1288
+ fail!( "sorry, cannot pop an empty vector")
1289
+ }
1290
+ let valptr = ptr:: to_mut_unsafe_ptr( & mut self [ ln - 1 u] ) ;
1291
+ unsafe {
1292
+ let val = ptr:: replace_ptr( valptr, intrinsics:: init( ) ) ;
1293
+ raw :: set_len( self , ln - 1 u) ;
1294
+ val
1295
+ }
1306
1296
}
1307
1297
1308
1298
/// Removes the first element from a vector and return it
1309
- #[ inline]
1310
1299
fn shift( & mut self ) -> T {
1311
- self . shift_opt( ) . expect( "shift: empty vector")
1312
- }
1313
-
1314
- /// Removes the first element from a vector and return it, or `None` if it is empty
1315
- fn shift_opt( & mut self ) -> Option <T > {
1316
1300
unsafe {
1317
- let ln = match self . len( ) {
1318
- 0 => return None ,
1319
- 1 => return self . pop_opt( ) ,
1320
- 2 => {
1321
- let last = self . pop( ) ;
1322
- let first = self . pop_opt( ) ;
1323
- self . push( last) ;
1324
- return first;
1325
- }
1326
- x => x
1327
- } ;
1301
+ assert!( !self . is_empty( ) ) ;
1302
+
1303
+ if self . len( ) == 1 { return self . pop( ) }
1304
+
1305
+ if self . len( ) == 2 {
1306
+ let last = self . pop( ) ;
1307
+ let first = self . pop( ) ;
1308
+ self . push( last) ;
1309
+ return first;
1310
+ }
1328
1311
1312
+ let ln = self . len( ) ;
1329
1313
let next_ln = self . len( ) - 1 ;
1330
1314
1331
1315
// Save the last element. We're going to overwrite its position
@@ -1361,7 +1345,7 @@ impl<T> OwnedVector<T> for ~[T] {
1361
1345
let vp = raw :: to_mut_ptr( * self ) ;
1362
1346
let vp = ptr:: mut_offset( vp, next_ln - 1 ) ;
1363
1347
1364
- Some ( ptr:: replace_ptr( vp, work_elt) )
1348
+ ptr:: replace_ptr( vp, work_elt)
1365
1349
}
1366
1350
}
1367
1351
@@ -2105,13 +2089,18 @@ impl<T> Iterator<T> for VecConsumeIterator<T> {
2105
2089
//
2106
2090
// [1,2,3,4,5] => 1, [5,2,3,4] => 2, [5,4,3] => 3, [5,4] => 4,
2107
2091
// [5] -> 5, []
2108
- let l = self . v . len ( ) ;
2109
- if self . idx < l {
2110
- self . v . swap ( self . idx , l - 1 ) ;
2111
- self . idx += 1 ;
2112
- }
2113
2092
2114
- self . v . pop_opt ( )
2093
+ if self . v . is_empty ( ) {
2094
+ None
2095
+ } else {
2096
+ let l = self . v . len ( ) ;
2097
+ if self . idx < l {
2098
+ self . v . swap ( self . idx , l - 1 ) ;
2099
+ self . idx += 1 ;
2100
+ }
2101
+
2102
+ Some ( self . v . pop ( ) )
2103
+ }
2115
2104
}
2116
2105
}
2117
2106
@@ -2122,7 +2111,8 @@ pub struct VecConsumeRevIterator<T> {
2122
2111
2123
2112
impl < T > Iterator < T > for VecConsumeRevIterator < T > {
2124
2113
fn next ( & mut self ) -> Option < T > {
2125
- self . v . pop_opt ( )
2114
+ if self . v . is_empty ( ) { None }
2115
+ else { Some ( self . v . pop ( ) ) }
2126
2116
}
2127
2117
}
2128
2118
@@ -2425,17 +2415,6 @@ mod tests {
2425
2415
}
2426
2416
2427
2417
#[ test]
2428
- fn test_pop_opt ( ) {
2429
- let mut v = ~[ 5 ] ;
2430
- let e = v. pop_opt ( ) ;
2431
- assert_eq ! ( v. len( ) , 0 ) ;
2432
- assert_eq ! ( e, Some ( 5 ) ) ;
2433
- let f = v. pop_opt ( ) ;
2434
- assert_eq ! ( f, None ) ;
2435
- let g = v. pop_opt ( ) ;
2436
- assert_eq ! ( g, None ) ;
2437
- }
2438
-
2439
2418
fn test_swap_remove ( ) {
2440
2419
let mut v = ~[ 1 , 2 , 3 , 4 , 5 ] ;
2441
2420
let mut e = v. swap_remove ( 0 ) ;
@@ -2770,27 +2749,6 @@ mod tests {
2770
2749
assert_eq ! ( [ & [ 1 ] , & [ 2 ] , & [ 3 ] ] . connect_vec( & 0 ) , ~[ 1 , 0 , 2 , 0 , 3 ] ) ;
2771
2750
}
2772
2751
2773
- #[ test]
2774
- fn test_shift ( ) {
2775
- let mut x = ~[ 1 , 2 , 3 ] ;
2776
- assert_eq ! ( x. shift( ) , 1 ) ;
2777
- assert_eq ! ( & x, & ~[ 2 , 3 ] ) ;
2778
- assert_eq ! ( x. shift( ) , 2 ) ;
2779
- assert_eq ! ( x. shift( ) , 3 ) ;
2780
- assert_eq ! ( x. len( ) , 0 ) ;
2781
- }
2782
-
2783
- #[ test]
2784
- fn test_shift_opt ( ) {
2785
- let mut x = ~[ 1 , 2 , 3 ] ;
2786
- assert_eq ! ( x. shift_opt( ) , Some ( 1 ) ) ;
2787
- assert_eq ! ( & x, & ~[ 2 , 3 ] ) ;
2788
- assert_eq ! ( x. shift_opt( ) , Some ( 2 ) ) ;
2789
- assert_eq ! ( x. shift_opt( ) , Some ( 3 ) ) ;
2790
- assert_eq ! ( x. shift_opt( ) , None ) ;
2791
- assert_eq ! ( x. len( ) , 0 ) ;
2792
- }
2793
-
2794
2752
#[ test]
2795
2753
fn test_unshift ( ) {
2796
2754
let mut x = ~[ 1 , 2 , 3 ] ;
0 commit comments