diff options
| author | Kiet Tran <ktt3ja@gmail.com> | 2014-03-11 00:53:23 -0400 |
|---|---|---|
| committer | Kiet Tran <ktt3ja@gmail.com> | 2014-03-12 15:31:30 -0400 |
| commit | ed2b3a2f0b8e0737b38528aa7d64efb176c7e2a8 (patch) | |
| tree | 06a4fc8e54d301a8658ca6a4b9ce88e7a8dfde63 /src/libstd | |
| parent | 18356675e51ca1d01493718df3f6feed52f096a9 (diff) | |
| download | rust-ed2b3a2f0b8e0737b38528aa7d64efb176c7e2a8.tar.gz rust-ed2b3a2f0b8e0737b38528aa7d64efb176c7e2a8.zip | |
Add shift and remove methods for Vec
Diffstat (limited to 'src/libstd')
| -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 eed5143b7cf..eb73416c801 100644 --- a/src/libstd/vec_ng.rs +++ b/src/libstd/vec_ng.rs @@ -398,6 +398,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); @@ -420,6 +425,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() |
