@@ -1368,13 +1368,24 @@ pub trait OwnedVector<T> {
1368
1368
/// ```
1369
1369
fn remove ( & mut self , i : uint ) -> Option < T > ;
1370
1370
1371
- /**
1372
- * Remove an element from anywhere in the vector and return it, replacing it
1373
- * with the last element. This does not preserve ordering, but is O(1).
1374
- *
1375
- * Fails if index >= length.
1376
- */
1377
- fn swap_remove ( & mut self , index : uint ) -> T ;
1371
+ /// Remove an element from anywhere in the vector and return it, replacing it
1372
+ /// with the last element. This does not preserve ordering, but is O(1).
1373
+ ///
1374
+ /// Returns `None` if `index` is out of bounds.
1375
+ ///
1376
+ /// # Example
1377
+ /// ```rust
1378
+ /// let mut v = ~[~"foo", ~"bar", ~"baz", ~"qux"];
1379
+ ///
1380
+ /// assert_eq!(v.swap_remove(1), Some(~"bar"));
1381
+ /// assert_eq!(v, ~[~"foo", ~"qux", ~"baz"]);
1382
+ ///
1383
+ /// assert_eq!(v.swap_remove(0), Some(~"foo"));
1384
+ /// assert_eq!(v, ~[~"baz", ~"qux"]);
1385
+ ///
1386
+ /// assert_eq!(v.swap_remove(2), None);
1387
+ /// ```
1388
+ fn swap_remove ( & mut self , index : uint ) -> Option < T > ;
1378
1389
1379
1390
/// Shorten a vector, dropping excess elements.
1380
1391
fn truncate ( & mut self , newlen : uint ) ;
@@ -1580,15 +1591,14 @@ impl<T> OwnedVector<T> for ~[T] {
1580
1591
None
1581
1592
}
1582
1593
}
1583
- fn swap_remove ( & mut self , index : uint ) -> T {
1594
+ fn swap_remove ( & mut self , index : uint ) -> Option < T > {
1584
1595
let ln = self . len ( ) ;
1585
- if index >= ln {
1586
- fail ! ( "vec::swap_remove - index {} >= length {}" , index, ln) ;
1587
- }
1588
1596
if index < ln - 1 {
1589
1597
self . swap ( index, ln - 1 ) ;
1598
+ } else if index >= ln {
1599
+ return None
1590
1600
}
1591
- self . pop ( ) . unwrap ( )
1601
+ self . pop ( )
1592
1602
}
1593
1603
fn truncate ( & mut self , newlen : uint ) {
1594
1604
let oldlen = self . len ( ) ;
@@ -3194,15 +3204,15 @@ mod tests {
3194
3204
fn test_swap_remove ( ) {
3195
3205
let mut v = ~[ 1 , 2 , 3 , 4 , 5 ] ;
3196
3206
let mut e = v. swap_remove ( 0 ) ;
3197
- assert_eq ! ( v. len( ) , 4 ) ;
3198
- assert_eq ! ( e, 1 ) ;
3199
- assert_eq ! ( v[ 0 ] , 5 ) ;
3207
+ assert_eq ! ( e, Some ( 1 ) ) ;
3208
+ assert_eq ! ( v, ~[ 5 , 2 , 3 , 4 ] ) ;
3200
3209
e = v. swap_remove ( 3 ) ;
3201
- assert_eq ! ( v. len( ) , 3 ) ;
3202
- assert_eq ! ( e, 4 ) ;
3203
- assert_eq ! ( v[ 0 ] , 5 ) ;
3204
- assert_eq ! ( v[ 1 ] , 2 ) ;
3205
- assert_eq ! ( v[ 2 ] , 3 ) ;
3210
+ assert_eq ! ( e, Some ( 4 ) ) ;
3211
+ assert_eq ! ( v, ~[ 5 , 2 , 3 ] ) ;
3212
+
3213
+ e = v. swap_remove ( 3 ) ;
3214
+ assert_eq ! ( e, None ) ;
3215
+ assert_eq ! ( v, ~[ 5 , 2 , 3 ] ) ;
3206
3216
}
3207
3217
3208
3218
#[ test]
0 commit comments