Skip to content

Commit 16e635c

Browse files
huonwalexcrichton
authored andcommitted
std: make .swap_remove return Option<T>.
This is one of the last raw "indexing" method on vectors that returns `T` instead of the Option.
1 parent 3ca0167 commit 16e635c

File tree

3 files changed

+35
-27
lines changed

3 files changed

+35
-27
lines changed

src/libgreen/stack.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ impl StackPool {
139139
pub fn take_stack(&mut self, min_size: uint) -> Stack {
140140
// Ideally this would be a binary search
141141
match self.stacks.iter().position(|s| min_size <= s.min_size) {
142-
Some(idx) => self.stacks.swap_remove(idx),
142+
Some(idx) => self.stacks.swap_remove(idx).unwrap(),
143143
None => Stack::new(min_size)
144144
}
145145
}

src/libstd/vec.rs

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1368,13 +1368,24 @@ pub trait OwnedVector<T> {
13681368
/// ```
13691369
fn remove(&mut self, i: uint) -> Option<T>;
13701370

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>;
13781389

13791390
/// Shorten a vector, dropping excess elements.
13801391
fn truncate(&mut self, newlen: uint);
@@ -1580,15 +1591,14 @@ impl<T> OwnedVector<T> for ~[T] {
15801591
None
15811592
}
15821593
}
1583-
fn swap_remove(&mut self, index: uint) -> T {
1594+
fn swap_remove(&mut self, index: uint) -> Option<T> {
15841595
let ln = self.len();
1585-
if index >= ln {
1586-
fail!("vec::swap_remove - index {} >= length {}", index, ln);
1587-
}
15881596
if index < ln - 1 {
15891597
self.swap(index, ln - 1);
1598+
} else if index >= ln {
1599+
return None
15901600
}
1591-
self.pop().unwrap()
1601+
self.pop()
15921602
}
15931603
fn truncate(&mut self, newlen: uint) {
15941604
let oldlen = self.len();
@@ -3194,15 +3204,15 @@ mod tests {
31943204
fn test_swap_remove() {
31953205
let mut v = ~[1, 2, 3, 4, 5];
31963206
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]);
32003209
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]);
32063216
}
32073217

32083218
#[test]

src/libstd/vec_ng.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -277,15 +277,14 @@ impl<T> Vec<T> {
277277
}
278278

279279
#[inline]
280-
pub fn swap_remove(&mut self, index: uint) -> T {
280+
pub fn swap_remove(&mut self, index: uint) -> Option<T> {
281281
let length = self.len();
282-
if index >= length {
283-
fail!("Vec::swap_remove - index {} >= length {}", index, length);
284-
}
285282
if index < length - 1 {
286283
self.as_mut_slice().swap(index, length - 1);
284+
} else if index >= length {
285+
return None
287286
}
288-
self.pop().unwrap()
287+
self.pop()
289288
}
290289

291290
#[inline]
@@ -392,4 +391,3 @@ impl<T> Drop for MoveItems<T> {
392391
}
393392
}
394393
}
395-

0 commit comments

Comments
 (0)