diff options
| -rw-r--r-- | src/libcore/cmp.rs | 34 | ||||
| -rw-r--r-- | src/libcoretest/cmp.rs | 7 |
2 files changed, 41 insertions, 0 deletions
diff --git a/src/libcore/cmp.rs b/src/libcore/cmp.rs index 3f739b86a1b..a2537a1281e 100644 --- a/src/libcore/cmp.rs +++ b/src/libcore/cmp.rs @@ -100,6 +100,40 @@ pub enum Ordering { Greater = 1i, } +impl Ordering { + /// Reverse the `Ordering`, so that `Less` becomes `Greater` and + /// vice versa. + /// + /// # Example + /// + /// ```rust + /// assert_eq!(Less.reverse(), Greater); + /// assert_eq!(Equal.reverse(), Equal); + /// assert_eq!(Greater.reverse(), Less); + /// + /// + /// let mut data = &mut [2u, 10, 5, 8]; + /// + /// // sort the array from largest to smallest. + /// data.sort_by(|a, b| a.cmp(b).reverse()); + /// + /// assert_eq!(data, &mut [10u, 8, 5, 2]); + /// ``` + #[inline] + #[experimental] + pub fn reverse(self) -> Ordering { + unsafe { + // this compiles really nicely (to a single instruction); + // an explicit match has a pile of branches and + // comparisons. + // + // NB. it is safe because of the explicit discriminants + // given above. + ::mem::transmute::<_, Ordering>(-(self as i8)) + } + } +} + /// Trait for types that form a [total order]( /// https://en.wikipedia.org/wiki/Total_order). /// diff --git a/src/libcoretest/cmp.rs b/src/libcoretest/cmp.rs index 88e944be3e8..4a38bb33d33 100644 --- a/src/libcoretest/cmp.rs +++ b/src/libcoretest/cmp.rs @@ -29,6 +29,13 @@ fn test_mut_int_totalord() { } #[test] +fn test_ordering_reverse() { + assert_eq!(Less.reverse(), Greater); + assert_eq!(Equal.reverse(), Equal); + assert_eq!(Greater.reverse(), Less); +} + +#[test] fn test_ordering_order() { assert!(Less < Equal); assert_eq!(Greater.cmp(&Less), Greater); |
