diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2013-08-14 20:40:15 -0700 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2013-08-16 16:09:33 -0700 |
| commit | 22c7bbfd0c49330015e24adeb0f2c45ae669c29f (patch) | |
| tree | 44c61eb2f97f4a828c691db400dffdf17765c911 /src/libstd/fmt | |
| parent | 109274426a7cd676b9aa1bb06afd9f86b44f6e9b (diff) | |
| download | rust-22c7bbfd0c49330015e24adeb0f2c45ae669c29f.tar.gz rust-22c7bbfd0c49330015e24adeb0f2c45ae669c29f.zip | |
Delegate `{}` to Default instead of Poly
By using a separate trait this is overridable on a per-type basis and makes room for the possibility of even more arguments passed in for the future.
Diffstat (limited to 'src/libstd/fmt')
| -rw-r--r-- | src/libstd/fmt/mod.rs | 50 | ||||
| -rw-r--r-- | src/libstd/fmt/parse.rs | 6 |
2 files changed, 55 insertions, 1 deletions
diff --git a/src/libstd/fmt/mod.rs b/src/libstd/fmt/mod.rs index cd3f85e83fa..29f55dc7260 100644 --- a/src/libstd/fmt/mod.rs +++ b/src/libstd/fmt/mod.rs @@ -356,28 +356,46 @@ pub struct Argument<'self> { priv value: &'self util::Void, } +/// When a format is not otherwise specified, types are formatted by ascribing +/// to this trait. There is not an explicit way of selecting this trait to be +/// used for formatting, it is only if no other format is specified. +#[allow(missing_doc)] +pub trait Default { fn fmt(&Self, &mut Formatter); } + +/// Format trait for the `b` character #[allow(missing_doc)] pub trait Bool { fn fmt(&Self, &mut Formatter); } +/// Format trait for the `c` character #[allow(missing_doc)] pub trait Char { fn fmt(&Self, &mut Formatter); } +/// Format trait for the `i` and `d` characters #[allow(missing_doc)] pub trait Signed { fn fmt(&Self, &mut Formatter); } +/// Format trait for the `u` character #[allow(missing_doc)] pub trait Unsigned { fn fmt(&Self, &mut Formatter); } +/// Format trait for the `o` character #[allow(missing_doc)] pub trait Octal { fn fmt(&Self, &mut Formatter); } +/// Format trait for the `b` character #[allow(missing_doc)] pub trait Binary { fn fmt(&Self, &mut Formatter); } +/// Format trait for the `x` character #[allow(missing_doc)] pub trait LowerHex { fn fmt(&Self, &mut Formatter); } +/// Format trait for the `X` character #[allow(missing_doc)] pub trait UpperHex { fn fmt(&Self, &mut Formatter); } +/// Format trait for the `s` character #[allow(missing_doc)] pub trait String { fn fmt(&Self, &mut Formatter); } +/// Format trait for the `?` character #[allow(missing_doc)] pub trait Poly { fn fmt(&Self, &mut Formatter); } +/// Format trait for the `p` character #[allow(missing_doc)] pub trait Pointer { fn fmt(&Self, &mut Formatter); } +/// Format trait for the `f` character #[allow(missing_doc)] pub trait Float { fn fmt(&Self, &mut Formatter); } @@ -855,5 +873,37 @@ impl<T> Pointer for *const T { } } +// Implementation of Default for various core types + +macro_rules! delegate(($ty:ty to $other:ident) => { + impl<'self> Default for $ty { + fn fmt(me: &$ty, f: &mut Formatter) { + $other::fmt(me, f) + } + } +}) +delegate!(int to Signed) +delegate!( i8 to Signed) +delegate!(i16 to Signed) +delegate!(i32 to Signed) +delegate!(i64 to Signed) +delegate!(uint to Unsigned) +delegate!( u8 to Unsigned) +delegate!( u16 to Unsigned) +delegate!( u32 to Unsigned) +delegate!( u64 to Unsigned) +delegate!(@str to String) +delegate!(~str to String) +delegate!(&'self str to String) +delegate!(bool to Bool) +delegate!(char to Char) +delegate!(float to Float) +delegate!(f32 to Float) +delegate!(f64 to Float) + +impl<T> Default for *const T { + fn fmt(me: &*const T, f: &mut Formatter) { Pointer::fmt(me, f) } +} + // If you expected tests to be here, look instead at the run-pass/ifmt.rs test, // it's a lot easier than creating all of the rt::Piece structures here. diff --git a/src/libstd/fmt/parse.rs b/src/libstd/fmt/parse.rs index 0d39ae84a60..ef8778abf0e 100644 --- a/src/libstd/fmt/parse.rs +++ b/src/libstd/fmt/parse.rs @@ -339,7 +339,11 @@ impl<'self> Parser<'self> { } } // Finally the actual format specifier - spec.ty = self.word(); + if self.consume('?') { + spec.ty = "?"; + } else { + spec.ty = self.word(); + } return spec; } |
