diff --git a/src/libsemver/lib.rs b/src/libsemver/lib.rs index 22664ba26281e..1832e7c0dff52 100644 --- a/src/libsemver/lib.rs +++ b/src/libsemver/lib.rs @@ -36,35 +36,23 @@ #![doc(html_logo_url = "http://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png", html_favicon_url = "http://www.rust-lang.org/favicon.ico", html_root_url = "http://doc.rust-lang.org/0.11.0/")] +#![feature(default_type_params)] use std::char; use std::cmp; -use std::fmt; use std::fmt::Show; -use std::option::{Option, Some, None}; -use std::string::String; +use std::fmt; +use std::hash; /// An identifier in the pre-release or build metadata. If the identifier can /// be parsed as a decimal value, it will be represented with `Numeric`. -#[deriving(Clone, PartialEq)] +#[deriving(Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] #[allow(missing_doc)] pub enum Identifier { Numeric(uint), AlphaNumeric(String) } -impl cmp::PartialOrd for Identifier { - #[inline] - fn partial_cmp(&self, other: &Identifier) -> Option { - match (self, other) { - (&Numeric(a), &Numeric(ref b)) => a.partial_cmp(b), - (&Numeric(_), _) => Some(Less), - (&AlphaNumeric(ref a), &AlphaNumeric(ref b)) => a.partial_cmp(b), - (&AlphaNumeric(_), _) => Some(Greater) - } - } -} - impl fmt::Show for Identifier { #[inline] fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { @@ -77,7 +65,7 @@ impl fmt::Show for Identifier { /// Represents a version number conforming to the semantic versioning scheme. -#[deriving(Clone)] +#[deriving(Clone, Eq)] pub struct Version { /// The major version, to be incremented on incompatible changes. pub major: uint, @@ -129,20 +117,25 @@ impl cmp::PartialEq for Version { } impl cmp::PartialOrd for Version { - #[inline] fn partial_cmp(&self, other: &Version) -> Option { - match self.major.partial_cmp(&other.major) { - Some(Equal) => {} + Some(self.cmp(other)) + } +} + +impl cmp::Ord for Version { + fn cmp(&self, other: &Version) -> Ordering { + match self.major.cmp(&other.major) { + Equal => {} r => return r, } - match self.minor.partial_cmp(&other.minor) { - Some(Equal) => {} + match self.minor.cmp(&other.minor) { + Equal => {} r => return r, } - match self.patch.partial_cmp(&other.patch) { - Some(Equal) => {} + match self.patch.cmp(&other.patch) { + Equal => {} r => return r, } @@ -150,14 +143,23 @@ impl cmp::PartialOrd for Version { // but the version of ord defined for vec // says that [] < [pre] so we alter it here match (self.pre.len(), other.pre.len()) { - (0, 0) => Some(Equal), - (0, _) => Some(Greater), - (_, 0) => Some(Less), - (_, _) => self.pre.partial_cmp(&other.pre) + (0, 0) => Equal, + (0, _) => Greater, + (_, 0) => Less, + (_, _) => self.pre.cmp(&other.pre) } } } +impl hash::Hash for Version { + fn hash(&self, into: &mut S) { + self.major.hash(into); + self.minor.hash(into); + self.patch.hash(into); + self.pre.hash(into); + } +} + fn take_nonempty_prefix>(rdr: &mut T, pred: |char| -> bool) -> (String, Option) { let mut buf = String::new(); diff --git a/src/libstd/path/posix.rs b/src/libstd/path/posix.rs index 5c6e140bd29b3..007686aa05cd5 100644 --- a/src/libstd/path/posix.rs +++ b/src/libstd/path/posix.rs @@ -12,7 +12,7 @@ use c_str::{CString, ToCStr}; use clone::Clone; -use cmp::{PartialEq, Eq}; +use cmp::{PartialEq, Eq, PartialOrd, Ord, Ordering}; use collections::Collection; use from_str::FromStr; use hash; @@ -68,6 +68,18 @@ impl PartialEq for Path { impl Eq for Path {} +impl PartialOrd for Path { + fn partial_cmp(&self, other: &Path) -> Option { + Some(self.cmp(other)) + } +} + +impl Ord for Path { + fn cmp(&self, other: &Path) -> Ordering { + self.repr.cmp(&other.repr) + } +} + impl FromStr for Path { fn from_str(s: &str) -> Option { Path::new_opt(s) diff --git a/src/libstd/path/windows.rs b/src/libstd/path/windows.rs index 5e42d740e0333..88ae0d4837e56 100644 --- a/src/libstd/path/windows.rs +++ b/src/libstd/path/windows.rs @@ -13,7 +13,7 @@ use ascii::AsciiCast; use c_str::{CString, ToCStr}; use clone::Clone; -use cmp::{PartialEq, Eq}; +use cmp::{PartialEq, Eq, PartialOrd, Ord, Ordering}; use collections::Collection; use from_str::FromStr; use hash; @@ -90,6 +90,18 @@ impl PartialEq for Path { impl Eq for Path {} +impl PartialOrd for Path { + fn partial_cmp(&self, other: &Path) -> Option { + Some(self.cmp(other)) + } +} + +impl Ord for Path { + fn cmp(&self, other: &Path) -> Ordering { + self.repr.cmp(&other.repr) + } +} + impl FromStr for Path { fn from_str(s: &str) -> Option { Path::new_opt(s)