Skip to content

Added to_str() method for HashMap and HashSet #6414

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
May 12, 2013
115 changes: 101 additions & 14 deletions src/libcore/to_str.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,12 @@ The `ToStr` trait for converting to strings

*/

use str;
use str::OwnedStr;
use hashmap::HashMap;
use hashmap::HashSet;
use container::Map;
use hash::Hash;
use cmp::Eq;

pub trait ToStr {
fn to_str(&self) -> ~str;
Expand Down Expand Up @@ -46,6 +51,44 @@ impl<A:ToStr> ToStr for (A,) {
}
}

impl<A:ToStr+Hash+Eq, B:ToStr+Hash+Eq> ToStr for HashMap<A, B> {
#[inline(always)]
fn to_str(&self) -> ~str {
let mut acc = ~"{", first = true;
for self.each |key, value| {
if first {
first = false;
}
else {
acc.push_str(", ");
}
acc.push_str(key.to_str());
acc.push_str(": ");
acc.push_str(value.to_str());
}
acc.push_char('}');
acc
}
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Change all the ~"foo" to "foo", expect for the initial one.

impl<A:ToStr+Hash+Eq> ToStr for HashSet<A> {
#[inline(always)]
fn to_str(&self) -> ~str {
let mut acc = ~"{", first = true;
for self.each |element| {
if first {
first = false;
}
else {
acc.push_str(", ");
}
acc.push_str(element.to_str());
}
acc.push_char('}');
acc
}
}

impl<A:ToStr,B:ToStr> ToStr for (A, B) {
#[inline(always)]
fn to_str(&self) -> ~str {
Expand All @@ -58,6 +101,7 @@ impl<A:ToStr,B:ToStr> ToStr for (A, B) {
}
}
}

impl<A:ToStr,B:ToStr,C:ToStr> ToStr for (A, B, C) {
#[inline(always)]
fn to_str(&self) -> ~str {
Expand All @@ -80,11 +124,15 @@ impl<'self,A:ToStr> ToStr for &'self [A] {
fn to_str(&self) -> ~str {
let mut acc = ~"[", first = true;
for self.each |elt| {
if first { first = false; }
else { str::push_str(&mut acc, ~", "); }
str::push_str(&mut acc, elt.to_str());
if first {
first = false;
}
else {
acc.push_str(", ");
}
acc.push_str(elt.to_str());
}
str::push_char(&mut acc, ']');
acc.push_char(']');
acc
}
}
Expand All @@ -94,11 +142,15 @@ impl<A:ToStr> ToStr for ~[A] {
fn to_str(&self) -> ~str {
let mut acc = ~"[", first = true;
for self.each |elt| {
if first { first = false; }
else { str::push_str(&mut acc, ~", "); }
str::push_str(&mut acc, elt.to_str());
if first {
first = false;
}
else {
acc.push_str(", ");
}
acc.push_str(elt.to_str());
}
str::push_char(&mut acc, ']');
acc.push_char(']');
acc
}
}
Expand All @@ -108,18 +160,25 @@ impl<A:ToStr> ToStr for @[A] {
fn to_str(&self) -> ~str {
let mut acc = ~"[", first = true;
for self.each |elt| {
if first { first = false; }
else { str::push_str(&mut acc, ~", "); }
str::push_str(&mut acc, elt.to_str());
if first {
first = false;
}
else {
acc.push_str(", ");
}
acc.push_str(elt.to_str());
}
str::push_char(&mut acc, ']');
acc.push_char(']');
acc
}
}

#[cfg(test)]
#[allow(non_implicitly_copyable_typarams)]
mod tests {
use hashmap::HashMap;
use hashmap::HashSet;
use container::Set;
#[test]
fn test_simple_types() {
assert!(1i.to_str() == ~"1");
Expand Down Expand Up @@ -149,4 +208,32 @@ mod tests {
assert!((~[~[], ~[1], ~[1, 1]]).to_str() ==
~"[[], [1], [1, 1]]");
}
}

#[test]
fn test_hashmap() {
let mut table: HashMap<int, int> = HashMap::new();
let empty: HashMap<int, int> = HashMap::new();

table.insert(3, 4);
table.insert(1, 2);

let table_str = table.to_str();

assert!(table_str == ~"{1: 2, 3: 4}" || table_str == ~"{3: 4, 1: 2}");
assert!(empty.to_str() == ~"{}");
}

#[test]
fn test_hashset() {
let mut set: HashSet<int> = HashSet::new();
let empty_set: HashSet<int> = HashSet::new();

set.insert(1);
set.insert(2);

let set_str = set.to_str();

assert!(set_str == ~"{1, 2}" || set_str == ~"{2, 1}");
assert!(empty_set.to_str() == ~"{}");
}
}