Skip to content
Snippets Groups Projects
Commit ec94e040 authored by pln's avatar pln
Browse files

new ptr

parent d23c1525
No related branches found
No related tags found
No related merge requests found
#![feature(const_size_of)]
use std::mem::{transmute, size_of};
use std::marker::Sized;
use std::str::Bytes;
use std::cmp::min;
//use std::str::Bytes;
//use std::cmp::min;
/*
trait SerData {
fn from_ser(&self) -> str;
fn to_ser(&mut self, &str);
}
*/
#[derive(Debug, Copy, Clone)]
#[repr(C)]
struct Point {
......@@ -17,57 +11,14 @@ struct Point {
y: u32,
}
//impl SerData for Point {
// fn from_ser(&self) -> str {
// }
//
//}
fn s<T>(_x: &T) {
println!(" size_of<T>() -> usize {}", size_of::<T>());
}
// in place tranformation
fn transform<T, F>(d: &mut T, f: F)
where
T: Iterator,
F: FnOnce(&mut u8),
{
for i in d {}
//let p = unsafe { transmute::<_, &mut [u8; _]>(d) };
//for i in &mut p.iter_mut() {
// f(i);
//}
//let mut p = unsafe { transmute::<_, &mut [u8; size_of::<T>()]>(d) };
// for i in p.as_bytes() {
// println!("{}", i);
// }
// for i in (size_of::<T>() as u32).into_iter() {
// println!("{} {}", i, *ptr.offset(i) as char);
//
// }
//
//
// let s: &str = "123";
// let ptr: *const u8 = s.as_ptr();
//
// unsafe {
// println!("{}", *ptr.offset(1) as char);
// println!("{}", *ptr.offset(2) as char);
// }
}
//
fn trans<T, F>(s: &mut T, mut f: F)
fn transform<T, F>(s: &mut T, mut f: F)
where
T: Sized,
F: FnMut(&mut u8),
{
let q: &mut [u8; 0] = unsafe { transmute(s) };
let ptr: *mut u8 = q.as_mut_ptr();
//let q: &mut [u8; 0] = unsafe { transmute(s) };
let ptr: *mut u8 = s as *mut T as *mut u8; // .as_mut_ptr();
for i in 0..size_of::<T>() {
println!("{} {}", i, unsafe { *ptr.offset(i as isize) } as u8);
......@@ -75,59 +26,22 @@ where
}
}
//fn trans<T, F>(s: &mut T, d: &mut [u8], f: F)
//where
// T: Copy + Sized,
// F: FnOnce(&mut u8),
//{
// assert_eq!(size_of::<T>(), d.len());
//
// let q: &mut [u8; 0] = unsafe { transmute(s) };
// let ptr: *mut u8 = q.as_mut_ptr();
//
// for i in 0..d.len() {
// println!("{} {}", i, unsafe { *ptr.offset(i as isize) } as u8);
// f(unsafe { &mut *ptr.offset(i as isize) });
// }
//}
fn main() {
let mut p = Point { x: 0, y: 1 };
println!(" p {:?}", p);
let mut a: [u8; size_of::<Point>()] = [0; size_of::<Point>()];
let mut x = 0;
trans(&mut p, |i| {
transform(&mut p, |i| {
*i += x;
x += 1;
});
println!(" p {:?}", p);
x = 0;
transform(&mut p, |i| {
*i -= x;
x += 1;
});
//
// //transform(&mut p, |i| *i += 1);
//
// let mut a: [u8; size_of::<Point>()] = [0; size_of::<Point>()];
// let ap = unsafe { transmute::<_, &mut Point>(&mut a) };
// *ap = p.clone(); // doing the copy
//
// s(&p);
// println!(" size_of<T>() -> usize {}", size_of::<Point>());
// println!(" p {:?}", p);
// println!(" ap {:?}", ap);
//
// for i in &mut a.iter_mut() {
// *i += 1;
// }
//
// println!(" ap {:?}", ap);
//
// for i in &mut a.iter_mut() {
// *i -= 1;
// }
//
// println!(" ap {:?}", ap);
//
println!(" p {:?}", p);
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment