Created
January 10, 2025 13:44
-
-
Save hikalium/3e4f058a6714f9f3d3d939b3e2b4d97a to your computer and use it in GitHub Desktop.
This file contains hidden or 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
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