Isn’t this already possible? Unless I’m misunderstanding you
#[derive(Debug)]
struct Dst {
len: u8,
data: [u8]
}
#[derive(Debug)]
struct Container {
tag: u8,
dst: Dst
}
fn main() {
let x: &Container;
let bytes = [1u8, 2, 3, 4, 5, 6];
x = unsafe {std::mem::transmute((&bytes, 4usize))};
println!("x = {:?}", x);
println!("sizeof(x) = {}", std::mem::size_of_val(x));
println!("sizeof(x.dst) = {}", std::mem::size_of_val(&x.dst));
println!("sizeof(x.dst.data) = {}", std::mem::size_of_val(&x.dst.data));
}
The only thing missing is use with unions
edit: In safe rust, without transmute:
#[derive(Debug)]
struct Dst<T: ?Sized> {
len: u8,
data: T
}
#[derive(Debug)]
struct Container<T: ?Sized> {
tag: u8,
dst: Dst<T>
}
fn main() {
let x = Container { tag: 1, dst: Dst { len: 4, data: [2, 3, 5, 6] } };
let x: &Container<[u8]> = &x;
println!("x = {:?}", x);
println!("sizeof(x) = {}", std::mem::size_of_val(x));
println!("sizeof(x.dst) = {}", std::mem::size_of_val(&x.dst));
println!("sizeof(x.dst.data) = {}", std::mem::size_of_val(&x.dst.data));
}
/* Prints:
x = Container { tag: 1, dst: Dst { len: 4, data: [2, 3, 5, 6] } }
sizeof(x) = 6
sizeof(x.dst) = 5
sizeof(x.dst.data) = 4
*/