Skip to content

Instantly share code, notes, and snippets.

@hikalium
Created January 10, 2025 13:44
Show Gist options
  • Save hikalium/3e4f058a6714f9f3d3d939b3e2b4d97a to your computer and use it in GitHub Desktop.
Save hikalium/3e4f058a6714f9f3d3d939b3e2b4d97a to your computer and use it in GitHub Desktop.
use std::borrow::BorrowMut;
use std::convert::From;
use std::ops::Drop;
use std::pin::Pin;
#[derive(Debug)]
#[allow(dead_code)]
struct U8Wrapper(u8, ());
impl From<u8> for U8Wrapper {
fn from(value: u8) -> Self {
Self(value, Default::default())
}
}
impl Drop for U8Wrapper {
fn drop(&mut self) {
println!("{self:?}@{self:p} dropped")
}
}
fn main() {
let mut value_a = U8Wrapper::from(3);
let mut value_b = U8Wrapper::from(5);
{
let ref_a = &mut value_a;
let ref_b = &mut value_b;
println!();
println!("ref_a: {}", std::any::type_name_of_val(&ref_a));
println!("ref_b: {}", std::any::type_name_of_val(&ref_b));
println!(
"(ref_a, ref_b) @ ({0:p}, {1:p}) = ({0:?}, {1:?})",
ref_a, ref_b
);
std::mem::swap::<U8Wrapper>(ref_a.borrow_mut(), ref_b.borrow_mut());
println!("swap(ref_a, ref_b)");
println!(
"(ref_a, ref_b) @ ({0:p}, {1:p}) = ({0:?}, {1:?})",
ref_a, ref_b
);
let mut ref_a = Pin::new(ref_a);
let mut ref_b = Pin::new(ref_b);
println!();
println!("ref_a: {}", std::any::type_name_of_val(&ref_a));
println!("ref_b: {}", std::any::type_name_of_val(&ref_b));
println!(
"(ref_a, ref_b) @ ({0:p}, {1:p}) = ({0:?}, {1:?})",
ref_a, ref_b
);
std::mem::swap::<U8Wrapper>(ref_a.borrow_mut(), ref_b.borrow_mut());
println!("swap(ref_a, ref_b)");
println!(
"(ref_a, ref_b) @ ({0:p}, {1:p}) = ({0:?}, {1:?})",
ref_a, ref_b
);
}
{
let mut ref_a = Box::new(value_a);
let mut ref_b = Box::new(value_b);
println!();
println!("ref_a: {}", std::any::type_name_of_val(&ref_a));
println!("ref_b: {}", std::any::type_name_of_val(&ref_b));
println!(
"(ref_a, ref_b) @ ({0:p}, {1:p}) = ({0:?}, {1:?})",
ref_a, ref_b
);
std::mem::swap::<U8Wrapper>(ref_a.borrow_mut(), ref_b.borrow_mut());
println!("swap(ref_a, ref_b)");
println!(
"(ref_a, ref_b) @ ({0:p}, {1:p}) = ({0:?}, {1:?})",
ref_a, ref_b
);
let mut ref_a = Pin::new(ref_a);
let mut ref_b = Pin::new(ref_b);
println!();
println!("ref_a: {}", std::any::type_name_of_val(&ref_a));
println!("ref_b: {}", std::any::type_name_of_val(&ref_b));
println!(
"(ref_a, ref_b) @ ({0:p}, {1:p}) = ({0:?}, {1:?})",
ref_a, ref_b
);
std::mem::swap::<U8Wrapper>(ref_a.borrow_mut(), ref_b.borrow_mut());
println!("swap(ref_a, ref_b)");
println!(
"(ref_a, ref_b) @ ({0:p}, {1:p}) = ({0:?}, {1:?})",
ref_a, ref_b
);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment