From 1cfa6569f9078090ac317af432adf712407bd4f7 Mon Sep 17 00:00:00 2001 From: nham Date: Sat, 26 Jul 2014 22:33:47 -0400 Subject: [PATCH 1/3] Implement Hash for RingBuf --- src/libcollections/ringbuf.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/libcollections/ringbuf.rs b/src/libcollections/ringbuf.rs index dcb8628c5a648..03532051d7a6d 100644 --- a/src/libcollections/ringbuf.rs +++ b/src/libcollections/ringbuf.rs @@ -19,6 +19,7 @@ use core::cmp; use core::default::Default; use core::fmt; use core::iter::RandomAccessIterator; +use std::hash::{Writer, Hash}; use {Deque, Collection, Mutable, MutableSeq}; use vec::Vec; @@ -450,6 +451,14 @@ impl PartialEq for RingBuf { } } +impl> Hash for RingBuf { + fn hash(&self, state: &mut S) { + for elt in self.iter() { + elt.hash(state); + } + } +} + impl FromIterator for RingBuf { fn from_iter>(iterator: T) -> RingBuf { let (lower, _) = iterator.size_hint(); @@ -485,6 +494,7 @@ mod tests { use std::fmt::Show; use std::prelude::*; use std::gc::{GC, Gc}; + use std::hash; use test::Bencher; use test; @@ -912,6 +922,24 @@ mod tests { assert!(e == RingBuf::new()); } + #[test] + fn test_hash() { + let mut x = RingBuf::new(); + let mut y = RingBuf::new(); + + x.push(1i); + x.push(2); + x.push(3); + + y.push(0i); + y.push(1i); + y.pop_front(); + y.push(2); + y.push(3); + + assert!(hash::hash(&x) == hash::hash(&y)); + } + #[test] fn test_show() { let ringbuf: RingBuf = range(0i, 10).collect(); From 63615778089545588ed15b7467bb3cca1c05c3a7 Mon Sep 17 00:00:00 2001 From: nham Date: Sat, 26 Jul 2014 23:18:56 -0400 Subject: [PATCH 2/3] Implement PartialOrd for RingBuf --- src/libcollections/ringbuf.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/libcollections/ringbuf.rs b/src/libcollections/ringbuf.rs index 03532051d7a6d..6b1670fbe855e 100644 --- a/src/libcollections/ringbuf.rs +++ b/src/libcollections/ringbuf.rs @@ -19,6 +19,7 @@ use core::cmp; use core::default::Default; use core::fmt; use core::iter::RandomAccessIterator; +use core::iter; use std::hash::{Writer, Hash}; use {Deque, Collection, Mutable, MutableSeq}; @@ -451,6 +452,12 @@ impl PartialEq for RingBuf { } } +impl PartialOrd for RingBuf { + fn partial_cmp(&self, other: &RingBuf) -> Option { + iter::order::partial_cmp(self.iter(), other.iter()) + } +} + impl> Hash for RingBuf { fn hash(&self, state: &mut S) { for elt in self.iter() { @@ -940,6 +947,19 @@ mod tests { assert!(hash::hash(&x) == hash::hash(&y)); } + #[test] + fn test_ord() { + let x = RingBuf::new(); + let mut y = RingBuf::new(); + y.push(1i); + y.push(2); + y.push(3); + assert!(x < y); + assert!(y > x); + assert!(x <= x); + assert!(x >= x); + } + #[test] fn test_show() { let ringbuf: RingBuf = range(0i, 10).collect(); From 9fa4424b71c1e8a0616e82a34f406a109dffe685 Mon Sep 17 00:00:00 2001 From: nham Date: Sun, 27 Jul 2014 12:37:32 -0400 Subject: [PATCH 3/3] Hash the length of the RingBuf before hashing elements --- src/libcollections/ringbuf.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libcollections/ringbuf.rs b/src/libcollections/ringbuf.rs index 6b1670fbe855e..44b546f665688 100644 --- a/src/libcollections/ringbuf.rs +++ b/src/libcollections/ringbuf.rs @@ -460,6 +460,7 @@ impl PartialOrd for RingBuf { impl> Hash for RingBuf { fn hash(&self, state: &mut S) { + self.len().hash(state); for elt in self.iter() { elt.hash(state); }