Skip to content

Instantly share code, notes, and snippets.

@little-arhat
Created September 14, 2014 19:31
Show Gist options
  • Save little-arhat/8e1394f8e88f671b02c1 to your computer and use it in GitHub Desktop.
Save little-arhat/8e1394f8e88f671b02c1 to your computer and use it in GitHub Desktop.
extern crate collections;
extern crate core;
use std::vec::Vec;
use core::ptr;
use std::slice::MutableCloneableSlice;
// as in OCaml's Array.blit
fn vec_blit<T:Primitive>(src: &[T], src_ofs: uint, dst: &mut Vec<T>, dst_ofs: uint, len: uint) {
if (src_ofs > src.len() - len) || (dst_ofs > dst.len() - len) {
fail!("blit: invalid argument!");
}
unsafe {
let pd = dst.as_mut_ptr().offset(dst_ofs as int);
let ps = src.as_ptr().offset(src_ofs as int);
ptr::copy_memory(pd, ps, len);
}
}
fn slice_blit<T:Clone>(src: &[T], src_ofs: uint, dst: &mut [T], dst_ofs: uint, len: uint) {
if (src_ofs > src.len() - len) || (dst_ofs > dst.len() - len) {
fail!("blit: invalid argument!");
}
let sd = dst.mut_slice(dst_ofs, dst_ofs + len);
let ss = src.slice(src_ofs, src_ofs + len);
let _ = sd.clone_from_slice(ss);
}
fn main() {
let mut d = Vec::from_elem(5, 0i);
let e = Vec::from_elem(4, 3i);
println!("slice_blit before: {}", d);
slice_blit(e.as_slice(), 0, d.as_mut_slice(), 0, 3);
println!("slice_blit after {}", d);
let mut d = Vec::from_elem(5, 0i);
let e = Vec::from_elem(4, 3i);
println!("vec_blit before: {}", d);
vec_blit(e.as_slice(), 0, &mut d, 0, 3);
println!("vec_blit after {}", d);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment