diff --git a/src/libcollections/ringbuf.rs b/src/libcollections/ringbuf.rs index dcb8628c5a648..44b546f665688 100644 --- a/src/libcollections/ringbuf.rs +++ b/src/libcollections/ringbuf.rs @@ -19,6 +19,8 @@ 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}; use vec::Vec; @@ -450,6 +452,21 @@ 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) { + self.len().hash(state); + 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 +502,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 +930,37 @@ 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_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();