From ed2b3a2f0b8e0737b38528aa7d64efb176c7e2a8 Mon Sep 17 00:00:00 2001 From: Kiet Tran Date: Tue, 11 Mar 2014 00:53:23 -0400 Subject: [PATCH] Add shift and remove methods for Vec --- src/libstd/vec_ng.rs | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/libstd/vec_ng.rs b/src/libstd/vec_ng.rs index eed5143b7cff..eb73416c8016 100644 --- a/src/libstd/vec_ng.rs +++ b/src/libstd/vec_ng.rs @@ -398,6 +398,11 @@ impl Vec { self.insert(0, element) } + #[inline] + pub fn shift(&mut self) -> Option { + self.remove(0) + } + pub fn insert(&mut self, index: uint, element: T) { let len = self.len(); assert!(index <= len); @@ -420,6 +425,30 @@ impl Vec { } } + fn remove(&mut self, index: uint) -> Option { + 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()