Created
September 14, 2014 19:31
-
-
Save little-arhat/8e1394f8e88f671b02c1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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