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();