Skip to content

Commit

Permalink
Allow ?Sized types in Rc’s impls of {Partial,}{Ord,Eq} and Borrow
Browse files Browse the repository at this point in the history
  • Loading branch information
ftxqxd committed May 15, 2015
1 parent 716f920 commit fa28642
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 0 deletions.
48 changes: 48 additions & 0 deletions src/liballoc/rc.rs
Expand Up @@ -634,7 +634,18 @@ impl<T: Default> Default for Rc<T> {
}

#[stable(feature = "rust1", since = "1.0.0")]
#[cfg(stage0)]
impl<T: PartialEq> PartialEq for Rc<T> {
#[inline(always)]
fn eq(&self, other: &Rc<T>) -> bool { **self == **other }

#[inline(always)]
fn ne(&self, other: &Rc<T>) -> bool { **self != **other }
}

#[stable(feature = "rust1", since = "1.0.0")]
#[cfg(not(stage0))]
impl<T: ?Sized + PartialEq> PartialEq for Rc<T> {
/// Equality for two `Rc<T>`s.
///
/// Two `Rc<T>`s are equal if their inner value are equal.
Expand Down Expand Up @@ -669,10 +680,35 @@ impl<T: PartialEq> PartialEq for Rc<T> {
}

#[stable(feature = "rust1", since = "1.0.0")]
#[cfg(stage0)]
impl<T: Eq> Eq for Rc<T> {}
#[stable(feature = "rust1", since = "1.0.0")]
#[cfg(not(stage0))]
impl<T: ?Sized + Eq> Eq for Rc<T> {}

#[stable(feature = "rust1", since = "1.0.0")]
#[cfg(stage0)]
impl<T: PartialOrd> PartialOrd for Rc<T> {
#[inline(always)]
fn partial_cmp(&self, other: &Rc<T>) -> Option<Ordering> {
(**self).partial_cmp(&**other)
}

#[inline(always)]
fn lt(&self, other: &Rc<T>) -> bool { **self < **other }

#[inline(always)]
fn le(&self, other: &Rc<T>) -> bool { **self <= **other }

#[inline(always)]
fn gt(&self, other: &Rc<T>) -> bool { **self > **other }

#[inline(always)]
fn ge(&self, other: &Rc<T>) -> bool { **self >= **other }
}
#[stable(feature = "rust1", since = "1.0.0")]
#[cfg(not(stage0))]
impl<T: ?Sized + PartialOrd> PartialOrd for Rc<T> {
/// Partial comparison for two `Rc<T>`s.
///
/// The two are compared by calling `partial_cmp()` on their inner values.
Expand Down Expand Up @@ -757,7 +793,14 @@ impl<T: PartialOrd> PartialOrd for Rc<T> {
}

#[stable(feature = "rust1", since = "1.0.0")]
#[cfg(stage0)]
impl<T: Ord> Ord for Rc<T> {
#[inline]
fn cmp(&self, other: &Rc<T>) -> Ordering { (**self).cmp(&**other) }
}
#[stable(feature = "rust1", since = "1.0.0")]
#[cfg(not(stage0))]
impl<T: ?Sized + Ord> Ord for Rc<T> {
/// Comparison for two `Rc<T>`s.
///
/// The two are compared by calling `cmp()` on their inner values.
Expand Down Expand Up @@ -1399,4 +1442,9 @@ mod tests {
assert_eq!(format!("{:?}", foo), "75");
}

#[test]
fn test_unsized() {
let foo: Rc<[i32]> = Rc::new([1, 2, 3]);
assert_eq!(foo, foo.clone());
}
}
6 changes: 6 additions & 0 deletions src/libcollections/borrow.rs
Expand Up @@ -116,10 +116,16 @@ impl<'a, T: ?Sized> BorrowMut<T> for &'a mut T {
fn borrow_mut(&mut self) -> &mut T { &mut **self }
}

#[cfg(stage0)]
impl<T> Borrow<T> for rc::Rc<T> {
fn borrow(&self) -> &T { &**self }
}

#[cfg(not(stage0))]
impl<T: ?Sized> Borrow<T> for rc::Rc<T> {
fn borrow(&self) -> &T { &**self }
}

impl<T> Borrow<T> for arc::Arc<T> {
fn borrow(&self) -> &T { &**self }
}
Expand Down

0 comments on commit fa28642

Please sign in to comment.