about summary refs log tree commit diff
path: root/src/libstd/tuple.rs
diff options
context:
space:
mode:
authorBrendan Zabarauskas <bjzaba@yahoo.com.au>2014-02-15 01:20:43 +1100
committerBrendan Zabarauskas <bjzaba@yahoo.com.au>2014-02-16 19:12:28 +1100
commitbf6abf8cb3d1e169c1baab8d266bd43c58dfbcc6 (patch)
treece3359bf21b757297412d6deacc6ed4e81cb4aec /src/libstd/tuple.rs
parent5d4fd50af3c16ffe43c8035b929374e13bb76793 (diff)
downloadrust-bf6abf8cb3d1e169c1baab8d266bd43c58dfbcc6.tar.gz
rust-bf6abf8cb3d1e169c1baab8d266bd43c58dfbcc6.zip
Implement Show for 1-12 element tuples
Diffstat (limited to 'src/libstd/tuple.rs')
-rw-r--r--src/libstd/tuple.rs26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/libstd/tuple.rs b/src/libstd/tuple.rs
index 33d23df242c..9a1fda07ecd 100644
--- a/src/libstd/tuple.rs
+++ b/src/libstd/tuple.rs
@@ -15,6 +15,8 @@
 use clone::Clone;
 #[cfg(not(test))] use cmp::*;
 #[cfg(not(test))] use default::Default;
+use fmt;
+use result::{Ok, Err};
 
 /// Method extensions to pairs where both types satisfy the `Clone` bound
 pub trait CloneableTuple<T, U> {
@@ -176,6 +178,12 @@ macro_rules! tuple_impls {
                     ($({ let x: $T = Default::default(); x},)+)
                 }
             }
+
+            impl<$($T: fmt::Show),+> fmt::Show for ($($T,)+) {
+                fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+                    write_tuple!(f.buf, $(self.$get_ref_fn()),+)
+                }
+            }
         )+
     }
 }
@@ -202,6 +210,17 @@ macro_rules! lexical_cmp {
     ($a:expr, $b:expr) => { ($a).cmp($b) };
 }
 
+macro_rules! write_tuple {
+    ($buf:expr, $x:expr) => (
+        write!($buf, "({},)", *$x)
+    );
+    ($buf:expr, $hd:expr, $($tl:expr),+) => ({
+        if_ok!(write!($buf, "("));
+        if_ok!(write!($buf, "{}", *$hd));
+        $(if_ok!(write!($buf, ", {}", *$tl));)+
+        write!($buf, ")")
+    });
+}
 
 tuple_impls! {
     (Tuple1, ImmutableTuple1) {
@@ -422,4 +441,11 @@ mod tests {
         assert_eq!(small.cmp(&big), Less);
         assert_eq!(big.cmp(&small), Greater);
     }
+
+    #[test]
+    fn test_show() {
+        assert_eq!(format!("{}", (1,)), ~"(1,)");
+        assert_eq!(format!("{}", (1, true)), ~"(1, true)");
+        assert_eq!(format!("{}", (1, ~"hi", true)), ~"(1, hi, true)");
+    }
 }