diff --git a/src/libcore/cmp.rs b/src/libcore/cmp.rs index a928d3bb2af..f96575aaf41 100644 --- a/src/libcore/cmp.rs +++ b/src/libcore/cmp.rs @@ -64,14 +64,32 @@ totaleq_impl!(i64) totaleq_impl!(int) totaleq_impl!(uint) -#[deriving(Eq)] -pub enum Ordering { Less, Equal, Greater } +#[deriving(Clone, Eq)] +pub enum Ordering { Less = -1, Equal = 0, Greater = 1 } /// Trait for types that form a total order pub trait TotalOrd: TotalEq { fn cmp(&self, other: &Self) -> Ordering; } +impl TotalOrd for Ordering { + #[inline(always)] + fn cmp(&self, other: &Ordering) -> Ordering { + (*self as int).cmp(&(*other as int)) + } +} + +impl Ord for Ordering { + #[inline(always)] + fn lt(&self, other: &Ordering) -> bool { (*self as int) < (*other as int) } + #[inline(always)] + fn le(&self, other: &Ordering) -> bool { (*self as int) <= (*other as int) } + #[inline(always)] + fn gt(&self, other: &Ordering) -> bool { (*self as int) > (*other as int) } + #[inline(always)] + fn ge(&self, other: &Ordering) -> bool { (*self as int) >= (*other as int) } +} + macro_rules! totalord_impl( ($t:ty) => { impl TotalOrd for $t { @@ -180,4 +198,10 @@ mod test { assert!(5.equals(&5)); assert!(!2.equals(&17)); } + + #[test] + fn test_ordering_order() { + assert!(Less < Equal); + assert_eq!(Greater.cmp(&Less), Greater); + } }