Skip to content

Instantly share code, notes, and snippets.

@abonander
Created November 10, 2014 09:35
Show Gist options
  • Save abonander/b3bcb80476414812fd99 to your computer and use it in GitHub Desktop.
Save abonander/b3bcb80476414812fd99 to your computer and use it in GitHub Desktop.
Prepend trait + impl for `Vec<T>` and `String`
trait Prepend<T> {
fn prepend(&mut self, t: T);
}
impl<S: Str> Prepend<S> for String {
fn prepend(&mut self, s: S) {
unsafe {
self.as_mut_vec().prepend(s.as_slice().as_bytes());
}
}
}
impl<'a, T> Prepend<&'a [T]> for Vec<T> {
fn prepend(&mut self, slice: &[T]) {
use std::ptr::copy_memory;
let old_len = self.len();
self.reserve(slice.len());
unsafe {
self.set_len(old_len + slice.len());
copy_memory(self[mut slice.len()..].as_mut_ptr(), self[..old_len].as_ptr(), old_len);
copy_memory(self.as_mut_ptr(), slice.as_ptr(), slice.len());
}
}
}
#[test]
fn test_prepend() {
let mut vec = vec![3u64, 4, 5];
vec.prepend([1u64, 2]);
assert_eq!(vec[], [1u64, 2, 3, 4, 5][]);
}
#[test]
fn test_prepend_string() {
let mut string = "World!".into_string();
string.prepend("Hello, ");
assert_eq!(&*string, "Hello, World!");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment