Your main function must be implemented using unsafe code in order to use raw pointers. Source pointers allow you to bypass Rust alias rules. You can then have two functions that act as safe facades for this unsafe implementation.
unsafe fn foo(src: *const u8, dst: *mut u8, len: usize) { for i in 0..len - 1 { *dst.offset(i as isize) = *src.offset(i as isize + 1) * 2; } } fn foo_inplace(buf: &mut [u8]) { unsafe { foo(buf.as_ptr(), buf.as_mut_ptr(), buf.len()) } } fn foo_separate(src: &[u8], dst: &mut [u8]) { assert!(src.len() == dst.len()); unsafe { foo(src.as_ptr(), dst.as_mut_ptr(), src.len()) } } fn main() { let src = &[0, 1, 2, 3, 4, 5]; let dst = &mut [0, 0, 0, 0, 0, 0]; let buf = &mut [11, 22, 33, 44, 55, 66]; foo_separate(src, dst); foo_inplace(buf); println!("src: {:?}", src); println!("dst: {:?}", dst); println!("buf: {:?}", buf); }
as_ptr() , as_mut_ptr() and len() are as_mut_ptr() methods.
source share