From 72373438d28eecfa565ad16bd84f800b8c8067c0 Mon Sep 17 00:00:00 2001 From: Marijn Haverbeke Date: Wed, 22 Feb 2012 13:06:38 +0100 Subject: [PATCH] Add core::to_str module Provides a central iface for the various stringification functions. --- src/libcore/core.rc | 5 +++ src/libcore/to_str.rs | 91 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 src/libcore/to_str.rs diff --git a/src/libcore/core.rc b/src/libcore/core.rc index 12a45498983..933513c2019 100644 --- a/src/libcore/core.rc +++ b/src/libcore/core.rc @@ -38,6 +38,7 @@ export comm, task, future; export extfmt; export math, bessel; export tuple; +export to_str; // Built-in-type support modules @@ -74,6 +75,10 @@ mod result; mod tuple; mod iter; +// Useful ifaces + +mod to_str; + // Runtime and language-primitive support mod ctypes; diff --git a/src/libcore/to_str.rs b/src/libcore/to_str.rs new file mode 100644 index 00000000000..e361fc5e514 --- /dev/null +++ b/src/libcore/to_str.rs @@ -0,0 +1,91 @@ +iface to_str { fn to_str() -> str; } + +impl of to_str for int { + fn to_str() -> str { int::str(self) } +} +impl of to_str for uint { + fn to_str() -> str { uint::str(self) } +} +impl of to_str for u8 { + fn to_str() -> str { uint::str(self as uint) } +} +impl of to_str for float { + fn to_str() -> str { float::to_str(self, 4u) } +} +impl of to_str for bool { + fn to_str() -> str { bool::to_str(self) } +} +impl of to_str for () { + fn to_str() -> str { "()" } +} +impl of to_str for str { + fn to_str() -> str { self } +} + +impl of to_str for (A, B) { + fn to_str() -> str { + let (a, b) = self; + "(" + a.to_str() + ", " + b.to_str() + ")" + } +} +impl of to_str for (A, B, C){ + fn to_str() -> str { + let (a, b, c) = self; + "(" + a.to_str() + ", " + b.to_str() + ", " + c.to_str() + ")" + } +} + +impl of to_str for [A] { + fn to_str() -> str { + let acc = "[", first = true; + for elt in self { + if first { first = false; } + else { acc += ", "; } + acc += elt.to_str(); + } + acc += "]"; + acc + } +} + +impl of to_str for @A { + fn to_str() -> str { "@" + (*self).to_str() } +} +impl of to_str for ~A { + fn to_str() -> str { "~" + (*self).to_str() } +} + +#[cfg(test)] +mod tests { + #[test] + fn test_simple_types() { + assert 1.to_str() == "1"; + assert (-1).to_str() == "-1"; + assert 200u.to_str() == "200"; + assert 2u8.to_str() == "2"; + assert true.to_str() == "true"; + assert false.to_str() == "false"; + assert ().to_str() == "()"; + assert "hi".to_str() == "hi"; + } + + #[test] + fn test_tuple_types() { + assert (1, 2).to_str() == "(1, 2)"; + assert ("a", "b", false).to_str() == "(a, b, false)"; + assert ((), ((), 100)).to_str() == "((), ((), 100))"; + } + + fn test_vectors() { + let x: [int] = []; + assert x.to_str() == "[]"; + assert [1].to_str() == "[1]"; + assert [1, 2, 3].to_str() == "[1, 2, 3]"; + assert [[], [1], [1, 1]].to_str() == "[[], [1], [1, 1]]"; + } + + fn test_pointer_types() { + assert (@1).to_str() == "@1"; + assert (~(true, false)).to_str() == "~(true, false)"; + } +}