diff --git a/src/libstd/str.rs b/src/libstd/str.rs index aa6b1470b26..d8aab1a8dcc 100644 --- a/src/libstd/str.rs +++ b/src/libstd/str.rs @@ -2202,6 +2202,12 @@ impl<'self> Iterator for StrBytesRevIterator<'self> { } } +// This works because every lifetime is a sub-lifetime of 'static +impl<'self> Zero for &'self str { + fn zero() -> &'self str { "" } + fn is_zero(&self) -> bool { self.is_empty() } +} + impl Zero for ~str { fn zero() -> ~str { ~"" } fn is_zero(&self) -> bool { self.len() == 0 } @@ -3317,4 +3323,18 @@ mod tests { t("zzz", "zz", ~["","z"]); t("zzzzz", "zz", ~["","","z"]); } + + #[test] + fn test_str_zero() { + use num::Zero; + fn t() { + let s: S = Zero::zero(); + assert_eq!(s.as_slice(), ""); + assert!(s.is_zero()); + } + + t::<&str>(); + t::<@str>(); + t::<~str>(); + } } diff --git a/src/libstd/vec.rs b/src/libstd/vec.rs index 1a236a49a32..cdd9d71273a 100644 --- a/src/libstd/vec.rs +++ b/src/libstd/vec.rs @@ -2629,6 +2629,12 @@ impl Clone for ~[A] { } } +// This works because every lifetime is a sub-lifetime of 'static +impl<'self, A> Zero for &'self [A] { + fn zero() -> &'self [A] { &'self [] } + fn is_zero(&self) -> bool { self.is_empty() } +} + impl Zero for ~[A] { fn zero() -> ~[A] { ~[] } fn is_zero(&self) -> bool { self.len() == 0 } @@ -4293,4 +4299,20 @@ mod tests { } assert_eq!(v, ~[~[1,2,3],~[1,3,2],~[2,1,3],~[2,3,1],~[3,1,2],~[3,2,1]]); } + + #[test] + fn test_vec_zero() { + use num::Zero; + macro_rules! t ( + ($ty:ty) => { + let v: $ty = Zero::zero(); + assert!(v.is_empty()); + assert!(v.is_zero()); + } + ); + + t!(&[int]); + t!(@[int]); + t!(~[int]); + } }