diff options
Diffstat (limited to 'src/libstd/vec_ng.rs')
| -rw-r--r-- | src/libstd/vec_ng.rs | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/libstd/vec_ng.rs b/src/libstd/vec_ng.rs index 33916d0e3bf..199fc68be47 100644 --- a/src/libstd/vec_ng.rs +++ b/src/libstd/vec_ng.rs @@ -399,6 +399,11 @@ impl<T> Vec<T> { self.insert(0, element) } + #[inline] + pub fn shift(&mut self) -> Option<T> { + self.remove(0) + } + pub fn insert(&mut self, index: uint, element: T) { let len = self.len(); assert!(index <= len); @@ -421,6 +426,30 @@ impl<T> Vec<T> { } } + fn remove(&mut self, index: uint) -> Option<T> { + let len = self.len(); + if index < len { + unsafe { // infallible + let ret; + { + let slice = self.as_mut_slice(); + // the place we are taking from. + let ptr = slice.as_mut_ptr().offset(index as int); + // copy it out, unsafely having a copy of the value on + // the stack and in the vector at the same time. + ret = Some(ptr::read(ptr as *T)); + + // Shift everything down to fill in that spot. + ptr::copy_memory(ptr, &*ptr.offset(1), len - index - 1); + } + self.set_len(len - 1); + ret + } + } else { + None + } + } + #[inline] pub fn rev_iter<'a>(&'a self) -> RevItems<'a,T> { self.as_slice().rev_iter() |
