//! Operations on shared box types // NB: transitionary, de-mode-ing. #[forbid(deprecated_mode)]; #[forbid(deprecated_pattern)]; use cmp::{Eq, Ord}; use intrinsic::TyDesc; export ptr_eq, raw; mod raw { struct BoxHeaderRepr { ref_count: uint, type_desc: *TyDesc, prev: *BoxRepr, next: *BoxRepr, } struct BoxRepr { header: BoxHeaderRepr, data: u8 } } pure fn ptr_eq(a: @T, b: @T) -> bool { //! Determine if two shared boxes point to the same object unsafe { ptr::addr_of(*a) == ptr::addr_of(*b) } } #[cfg(stage0)] impl @const T : Eq { pure fn eq(&&other: @const T) -> bool { *self == *other } pure fn ne(&&other: @const T) -> bool { *self != *other } } #[cfg(stage1)] #[cfg(stage2)] impl @const T : Eq { pure fn eq(other: &@const T) -> bool { *self == *(*other) } pure fn ne(other: &@const T) -> bool { *self != *(*other) } } #[cfg(stage0)] impl @const T : Ord { pure fn lt(&&other: @const T) -> bool { *self < *other } pure fn le(&&other: @const T) -> bool { *self <= *other } pure fn ge(&&other: @const T) -> bool { *self >= *other } pure fn gt(&&other: @const T) -> bool { *self > *other } } #[cfg(stage1)] #[cfg(stage2)] impl @const T : Ord { pure fn lt(other: &@const T) -> bool { *self < *(*other) } pure fn le(other: &@const T) -> bool { *self <= *(*other) } pure fn ge(other: &@const T) -> bool { *self >= *(*other) } pure fn gt(other: &@const T) -> bool { *self > *(*other) } } #[test] fn test() { let x = @3; let y = @3; assert (ptr_eq::(x, x)); assert (ptr_eq::(y, y)); assert (!ptr_eq::(x, y)); assert (!ptr_eq::(y, x)); }