// Copyright 2012 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. //! Operations on managed box types use ptr; #[cfg(notest)] use cmp::{Eq, Ord}; pub mod raw { use intrinsic::TyDesc; pub static RC_EXCHANGE_UNIQUE : uint = (-1) as uint; pub static RC_MANAGED_UNIQUE : uint = (-2) as uint; pub static RC_IMMORTAL : uint = 0x77777777; pub struct BoxHeaderRepr { ref_count: uint, type_desc: *TyDesc, prev: *BoxRepr, next: *BoxRepr, } pub struct BoxRepr { header: BoxHeaderRepr, data: u8 } } #[inline(always)] pub 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)) } } #[inline(always)] pub fn mut_ptr_eq(a: @mut T, b: @mut T) -> bool { //! Determine if two mutable shared boxes point to the same object unsafe { ptr::addr_of(&(*a)) == ptr::addr_of(&(*b)) } } #[cfg(notest)] impl Eq for @T { #[inline(always)] fn eq(&self, other: &@T) -> bool { *(*self) == *(*other) } #[inline(always)] fn ne(&self, other: &@T) -> bool { *(*self) != *(*other) } } #[cfg(notest)] impl Eq for @mut T { #[inline(always)] fn eq(&self, other: &@mut T) -> bool { *(*self) == *(*other) } #[inline(always)] fn ne(&self, other: &@mut T) -> bool { *(*self) != *(*other) } } #[cfg(notest)] impl Ord for @T { #[inline(always)] fn lt(&self, other: &@T) -> bool { *(*self) < *(*other) } #[inline(always)] fn le(&self, other: &@T) -> bool { *(*self) <= *(*other) } #[inline(always)] fn ge(&self, other: &@T) -> bool { *(*self) >= *(*other) } #[inline(always)] fn gt(&self, other: &@T) -> bool { *(*self) > *(*other) } } #[cfg(notest)] impl Ord for @mut T { #[inline(always)] fn lt(&self, other: &@mut T) -> bool { *(*self) < *(*other) } #[inline(always)] fn le(&self, other: &@mut T) -> bool { *(*self) <= *(*other) } #[inline(always)] fn ge(&self, other: &@mut T) -> bool { *(*self) >= *(*other) } #[inline(always)] fn gt(&self, other: &@mut 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))); }