about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorkennytm <kennytm@gmail.com>2017-12-20 21:21:58 +0800
committerGitHub <noreply@github.com>2017-12-20 21:21:58 +0800
commit5e98112af4e8b4068bcee6a54e28031fc92d6a3f (patch)
tree5d79493d556f052fb6954cc08a593e272b2faea2 /src/libstd
parentf35bb15fc6fc764af9d97b240b133343b82a7e24 (diff)
parent1d5ead453dd96c1040a12cbb3b0180027af165c9 (diff)
downloadrust-5e98112af4e8b4068bcee6a54e28031fc92d6a3f.tar.gz
rust-5e98112af4e8b4068bcee6a54e28031fc92d6a3f.zip
Rollup merge of #46828 - vi:hash_for_systemtime_instant, r=dtolnay
Add Hash impl for SystemTime and Instant

Closes #46670.

Not sure how to actually test non-Linux platforms.
`rustc --target=i686-pc-windows-gnu --crate-name std --crate-type rlib src/libstd/lib.rs -o q.rlib` works a bit, but for Redox I'm not sure what to do.

r? @dtolnay
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/sys/redox/time.rs12
-rw-r--r--src/libstd/sys/unix/time.rs16
-rw-r--r--src/libstd/sys/wasm/time.rs4
-rw-r--r--src/libstd/sys/windows/time.rs9
-rw-r--r--src/libstd/time/mod.rs4
5 files changed, 34 insertions, 11 deletions
diff --git a/src/libstd/sys/redox/time.rs b/src/libstd/sys/redox/time.rs
index 6c071afd42d..cf798500b7f 100644
--- a/src/libstd/sys/redox/time.rs
+++ b/src/libstd/sys/redox/time.rs
@@ -13,6 +13,7 @@ use fmt;
 use sys::{cvt, syscall};
 use time::Duration;
 use convert::TryInto;
+use core::hash::{Hash, Hasher};
 
 const NSEC_PER_SEC: u64 = 1_000_000_000;
 
@@ -110,12 +111,19 @@ impl Ord for Timespec {
     }
 }
 
-#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
+impl Hash for Timespec {
+    fn hash<H : Hasher>(&self, state: &mut H) {
+        self.t.tv_sec.hash(state);
+        self.t.tv_nsec.hash(state);
+    }
+}
+
+#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
 pub struct Instant {
     t: Timespec,
 }
 
-#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
+#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
 pub struct SystemTime {
     t: Timespec,
 }
diff --git a/src/libstd/sys/unix/time.rs b/src/libstd/sys/unix/time.rs
index 837cd7292e2..83127935909 100644
--- a/src/libstd/sys/unix/time.rs
+++ b/src/libstd/sys/unix/time.rs
@@ -11,6 +11,7 @@
 use cmp::Ordering;
 use libc;
 use time::Duration;
+use core::hash::{Hash, Hasher};
 
 pub use self::inner::{Instant, SystemTime, UNIX_EPOCH};
 use convert::TryInto;
@@ -111,6 +112,13 @@ impl Ord for Timespec {
     }
 }
 
+impl Hash for Timespec {
+    fn hash<H : Hasher>(&self, state: &mut H) {
+        self.t.tv_sec.hash(state);
+        self.t.tv_nsec.hash(state);
+    }
+}
+
 #[cfg(any(target_os = "macos", target_os = "ios"))]
 mod inner {
     use fmt;
@@ -123,12 +131,12 @@ mod inner {
     use super::NSEC_PER_SEC;
     use super::Timespec;
 
-    #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug)]
+    #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
     pub struct Instant {
         t: u64
     }
 
-    #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
+    #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
     pub struct SystemTime {
         t: Timespec,
     }
@@ -255,12 +263,12 @@ mod inner {
 
     use super::Timespec;
 
-    #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
+    #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
     pub struct Instant {
         t: Timespec,
     }
 
-    #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
+    #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
     pub struct SystemTime {
         t: Timespec,
     }
diff --git a/src/libstd/sys/wasm/time.rs b/src/libstd/sys/wasm/time.rs
index 7907720e4da..c269def98f6 100644
--- a/src/libstd/sys/wasm/time.rs
+++ b/src/libstd/sys/wasm/time.rs
@@ -11,10 +11,10 @@
 use fmt;
 use time::Duration;
 
-#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug)]
+#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
 pub struct Instant;
 
-#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
+#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
 pub struct SystemTime;
 
 pub const UNIX_EPOCH: SystemTime = SystemTime;
diff --git a/src/libstd/sys/windows/time.rs b/src/libstd/sys/windows/time.rs
index 1be29b5139a..07e64d386a1 100644
--- a/src/libstd/sys/windows/time.rs
+++ b/src/libstd/sys/windows/time.rs
@@ -17,11 +17,12 @@ use sys::cvt;
 use sys_common::mul_div_u64;
 use time::Duration;
 use convert::TryInto;
+use core::hash::{Hash, Hasher};
 
 const NANOS_PER_SEC: u64 = 1_000_000_000;
 const INTERVALS_PER_SEC: u64 = NANOS_PER_SEC / 100;
 
-#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Debug)]
+#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Hash)]
 pub struct Instant {
     t: c::LARGE_INTEGER,
 }
@@ -173,6 +174,12 @@ impl From<c::FILETIME> for SystemTime {
     }
 }
 
+impl Hash for SystemTime {
+    fn hash<H : Hasher>(&self, state: &mut H) {
+        self.intervals().hash(state)
+    }
+}
+
 fn dur2intervals(d: &Duration) -> i64 {
     d.as_secs()
         .checked_mul(INTERVALS_PER_SEC)
diff --git a/src/libstd/time/mod.rs b/src/libstd/time/mod.rs
index d4993ded843..6ce3b3e8a00 100644
--- a/src/libstd/time/mod.rs
+++ b/src/libstd/time/mod.rs
@@ -66,7 +66,7 @@ mod duration;
 ///    println!("{}", now.elapsed().as_secs());
 /// }
 /// ```
-#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
+#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
 #[stable(feature = "time2", since = "1.8.0")]
 pub struct Instant(time::Instant);
 
@@ -118,7 +118,7 @@ pub struct Instant(time::Instant);
 ///    }
 /// }
 /// ```
-#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
+#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
 #[stable(feature = "time2", since = "1.8.0")]
 pub struct SystemTime(time::SystemTime);