Properly implement Show for EnumSet

This commit is contained in:
Steven Fackler 2014-09-13 17:37:03 -07:00
parent 79a5448f41
commit 0e8cc52311

View File

@ -14,8 +14,9 @@
//! representation to hold C-like enum variants.
use core::prelude::*;
use core::fmt;
#[deriving(Clone, PartialEq, Eq, Hash, Show)]
#[deriving(Clone, PartialEq, Eq, Hash)]
/// A specialized `Set` implementation to use enum types.
pub struct EnumSet<E> {
// We must maintain the invariant that no bits are set
@ -23,6 +24,21 @@ pub struct EnumSet<E> {
bits: uint
}
impl<E:CLike+fmt::Show> fmt::Show for EnumSet<E> {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
try!(write!(fmt, "{{"));
let mut first = true;
for e in self.iter() {
if !first {
try!(write!(fmt, ", "));
}
try!(write!(fmt, "{}", e));
first = false;
}
write!(fmt, "}}")
}
}
/// An interface for casting C-like enum to uint and back.
pub trait CLike {
/// Converts a C-like enum to a `uint`.
@ -165,6 +181,16 @@ fn test_empty() {
assert!(e.is_empty());
}
#[test]
fn test_show() {
let mut e = EnumSet::empty();
assert_eq!("{}", e.to_string().as_slice());
e.add(A);
assert_eq!("{A}", e.to_string().as_slice());
e.add(C);
assert_eq!("{A, C}", e.to_string().as_slice());
}
///////////////////////////////////////////////////////////////////////////
// intersect