diff --git a/src/protocol/v7.rs b/src/protocol/v7.rs index a78e3ba1..3d33601d 100644 --- a/src/protocol/v7.rs +++ b/src/protocol/v7.rs @@ -196,6 +196,36 @@ impl fmt::Display for Addr { } } +impl From for Addr { + fn from(addr: u64) -> Addr { + Addr(addr) + } +} + +impl From for Addr { + fn from(addr: u32) -> Addr { + Addr(addr as u64) + } +} + +impl From for Addr { + fn from(addr: usize) -> Addr { + Addr(addr as u64) + } +} + +impl From<*const T> for Addr { + fn from(addr: *const T) -> Addr { + Addr(addr as u64) + } +} + +impl Into for Addr { + fn into(self: Addr) -> u64 { + self.0 + } +} + /// Represents a single thread. #[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq)] #[serde(default)] diff --git a/tests/test_protocol_v7.rs b/tests/test_protocol_v7.rs index 397e7dbd..006c363e 100644 --- a/tests/test_protocol_v7.rs +++ b/tests/test_protocol_v7.rs @@ -550,6 +550,14 @@ fn test_addr_format() { assert_eq!(serde_json::from_str::("\"0X2A\"").unwrap(), v7::Addr(42)); } +#[test] +fn test_addr_api() { + use std::ptr; + assert_eq!(v7::Addr::from(42u64), v7::Addr(42)); + assert_eq!(v7::Addr::from(42u32), v7::Addr(42)); + assert_eq!(v7::Addr::from(ptr::null::<()>()), v7::Addr(0)); +} + #[test] fn test_thread_id_format() { assert_eq!(serde_json::to_string(&v7::ThreadId::Int(0)).unwrap(), "0");