Skip to content

Commit 57a653e

Browse files
author
blake2-ppc
committed
---
yaml --- r: 142486 b: refs/heads/try2 c: fc17d43 h: refs/heads/master v: v3
1 parent ef35c85 commit 57a653e

File tree

2 files changed

+41
-13
lines changed

2 files changed

+41
-13
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ refs/heads/snap-stage3: 78a7676898d9f80ab540c6df5d4c9ce35bb50463
55
refs/heads/try: 519addf6277dbafccbb4159db4b710c37eaa2ec5
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
8-
refs/heads/try2: d805b832f5a49acc66e0d2acda9f9f4cf074a374
8+
refs/heads/try2: fc17d4371f1d3e0c40ebcb6de0b9e7cbb89fa0c9
99
refs/heads/dist-snap: ba4081a5a8573875fed17545846f6f6902c8ba8d
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/try2/src/libstd/vec.rs

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1093,6 +1093,7 @@ pub trait OwnedVector<T> {
10931093
fn pop(&mut self) -> T;
10941094
fn pop_opt(&mut self) -> Option<T>;
10951095
fn shift(&mut self) -> T;
1096+
fn shift_opt(&mut self) -> Option<T>;
10961097
fn unshift(&mut self, x: T);
10971098
fn insert(&mut self, i: uint, x:T);
10981099
fn remove(&mut self, i: uint) -> T;
@@ -1305,20 +1306,26 @@ impl<T> OwnedVector<T> for ~[T] {
13051306
}
13061307

13071308
/// Removes the first element from a vector and return it
1309+
#[inline]
13081310
fn shift(&mut self) -> T {
1309-
unsafe {
1310-
assert!(!self.is_empty());
1311-
1312-
if self.len() == 1 { return self.pop() }
1311+
self.shift_opt().expect("shift: empty vector")
1312+
}
13131313

1314-
if self.len() == 2 {
1315-
let last = self.pop();
1316-
let first = self.pop();
1317-
self.push(last);
1318-
return first;
1319-
}
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+
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+
};
13201328

1321-
let ln = self.len();
13221329
let next_ln = self.len() - 1;
13231330

13241331
// Save the last element. We're going to overwrite its position
@@ -1354,7 +1361,7 @@ impl<T> OwnedVector<T> for ~[T] {
13541361
let vp = raw::to_mut_ptr(*self);
13551362
let vp = ptr::mut_offset(vp, next_ln - 1);
13561363

1357-
ptr::replace_ptr(vp, work_elt)
1364+
Some(ptr::replace_ptr(vp, work_elt))
13581365
}
13591366
}
13601367

@@ -2763,6 +2770,27 @@ mod tests {
27632770
assert_eq!([&[1], &[2], &[3]].connect_vec(&0), ~[1, 0, 2, 0, 3]);
27642771
}
27652772

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+
27662794
#[test]
27672795
fn test_unshift() {
27682796
let mut x = ~[1, 2, 3];

0 commit comments

Comments
 (0)