@@ -1091,6 +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 >;
1094
1095
fn shift( & mut self ) -> T ;
1095
1096
fn unshift( & mut self , x: T ) ;
1096
1097
fn insert( & mut self , i: uint, x: T ) ;
@@ -1281,20 +1282,28 @@ impl<T> OwnedVector<T> for ~[T] {
1281
1282
}
1282
1283
}
1283
1284
1284
- /// Remove the last element from a vector and return it
1285
- fn pop( & mut self ) -> T {
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
1285
+ /// Remove the last element from a vector and return it, or `None` if it is empty
1286
+ fn pop_opt( & mut self ) -> Option <T > {
1287
+ match self . len( ) {
1288
+ 0 => None ,
1289
+ ln => {
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
+ Some ( val)
1295
+ }
1296
+ }
1295
1297
}
1296
1298
}
1297
1299
1300
+
1301
+ /// Remove the last element from a vector and return it, failing if it is empty
1302
+ #[ inline]
1303
+ fn pop( & mut self ) -> T {
1304
+ self . pop_opt( ) . expect( "pop: empty vector")
1305
+ }
1306
+
1298
1307
/// Removes the first element from a vector and return it
1299
1308
fn shift( & mut self ) -> T {
1300
1309
unsafe {
@@ -2089,18 +2098,13 @@ impl<T> Iterator<T> for VecConsumeIterator<T> {
2089
2098
//
2090
2099
// [1,2,3,4,5] => 1, [5,2,3,4] => 2, [5,4,3] => 3, [5,4] => 4,
2091
2100
// [5] -> 5, []
2092
-
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 ( ) )
2101
+ let l = self . v . len ( ) ;
2102
+ if self . idx < l {
2103
+ self . v . swap ( self . idx , l - 1 ) ;
2104
+ self . idx += 1 ;
2103
2105
}
2106
+
2107
+ self . v . pop_opt ( )
2104
2108
}
2105
2109
}
2106
2110
@@ -2111,8 +2115,7 @@ pub struct VecConsumeRevIterator<T> {
2111
2115
2112
2116
impl < T > Iterator < T > for VecConsumeRevIterator < T > {
2113
2117
fn next ( & mut self ) -> Option < T > {
2114
- if self . v . is_empty ( ) { None }
2115
- else { Some ( self . v . pop ( ) ) }
2118
+ self . v . pop_opt ( )
2116
2119
}
2117
2120
}
2118
2121
@@ -2415,6 +2418,17 @@ mod tests {
2415
2418
}
2416
2419
2417
2420
#[ test]
2421
+ fn test_pop_opt ( ) {
2422
+ let mut v = ~[ 5 ] ;
2423
+ let e = v. pop_opt ( ) ;
2424
+ assert_eq ! ( v. len( ) , 0 ) ;
2425
+ assert_eq ! ( e, Some ( 5 ) ) ;
2426
+ let f = v. pop_opt ( ) ;
2427
+ assert_eq ! ( f, None ) ;
2428
+ let g = v. pop_opt ( ) ;
2429
+ assert_eq ! ( g, None ) ;
2430
+ }
2431
+
2418
2432
fn test_swap_remove ( ) {
2419
2433
let mut v = ~[ 1 , 2 , 3 , 4 , 5 ] ;
2420
2434
let mut e = v. swap_remove ( 0 ) ;
0 commit comments