Add Zero impls for lots of common types

This commit is contained in:
Alex Crichton 2013-06-14 18:27:52 -07:00
parent 07f5ab1009
commit 893c70d7bc
6 changed files with 63 additions and 2 deletions

View File

@ -17,8 +17,8 @@ use u32;
use uint;
use unicode::{derived_property, general_category};
#[cfg(not(test))]
use cmp::{Eq, Ord};
#[cfg(not(test))] use cmp::{Eq, Ord};
#[cfg(not(test))] use num::Zero;
/*
Lu Uppercase_Letter an uppercase letter
@ -328,6 +328,12 @@ impl Ord for char {
fn ge(&self, other: &char) -> bool { *self >= *other }
}
#[cfg(not(test))]
impl Zero for char {
fn zero() -> char { 0 as char }
fn is_zero(&self) -> bool { *self == 0 as char }
}
#[test]
fn test_is_lowercase() {
assert!('a'.is_lowercase());

View File

@ -418,6 +418,21 @@ pub fn pow_with_uint<T:NumCast+One+Zero+Copy+Div<T,T>+Mul<T,T>>(radix: uint, pow
total
}
impl<T: Zero> Zero for @mut T {
fn zero() -> @mut T { @mut Zero::zero() }
fn is_zero(&self) -> bool { (**self).is_zero() }
}
impl<T: Zero> Zero for @T {
fn zero() -> @T { @Zero::zero() }
fn is_zero(&self) -> bool { (**self).is_zero() }
}
impl<T: Zero> Zero for ~T {
fn zero() -> ~T { ~Zero::zero() }
fn is_zero(&self) -> bool { (**self).is_zero() }
}
/// Helper function for testing numeric operations
#[cfg(test)]
pub fn test_num<T:Num + NumCast>(ten: T, two: T) {

View File

@ -350,6 +350,11 @@ impl<T:Copy + Zero> Option<T> {
}
}
impl<T> Zero for Option<T> {
fn zero() -> Option<T> { None }
fn is_zero(&self) -> bool { self.is_none() }
}
/// Immutable iterator over an `Option<A>`
pub struct OptionIterator<'self, A> {
priv opt: Option<&'self A>

View File

@ -28,6 +28,7 @@ use container::Container;
use iter::Times;
use iterator::{Iterator, IteratorUtil, FilterIterator, AdditiveIterator};
use libc;
use num::Zero;
use option::{None, Option, Some};
use old_iter::{BaseIter, EqIter};
use ptr;
@ -2250,6 +2251,16 @@ impl<'self> Iterator<u8> for StrBytesRevIterator<'self> {
}
}
impl Zero for ~str {
fn zero() -> ~str { ~"" }
fn is_zero(&self) -> bool { self.len() == 0 }
}
impl Zero for @str {
fn zero() -> @str { @"" }
fn is_zero(&self) -> bool { self.len() == 0 }
}
#[cfg(test)]
mod tests {
use iterator::IteratorUtil;

View File

@ -135,6 +135,7 @@ macro_rules! tuple_impls {
pub mod inner {
use clone::Clone;
#[cfg(not(test))] use cmp::*;
#[cfg(not(test))] use num::Zero;
$(
pub trait $cloneable_trait<$($T),+> {
@ -210,6 +211,18 @@ macro_rules! tuple_impls {
lexical_cmp!($(self.$get_ref_fn(), other.$get_ref_fn()),+)
}
}
#[cfg(not(test))]
impl<$($T:Zero),+> Zero for ($($T),+) {
#[inline]
fn zero() -> ($($T),+) {
($(Zero::zero::<$T>()),+)
}
#[inline]
fn is_zero(&self) -> bool {
$(self.$get_ref_fn().is_zero())&&+
}
}
)+
}
}

View File

@ -23,6 +23,7 @@ use iterator::{Iterator, IteratorUtil};
use iter::FromIter;
use kinds::Copy;
use libc;
use num::Zero;
use old_iter::CopyableIter;
use option::{None, Option, Some};
use ptr::to_unsafe_ptr;
@ -2702,6 +2703,16 @@ impl<A:Clone> Clone for ~[A] {
}
}
impl<A> Zero for ~[A] {
fn zero() -> ~[A] { ~[] }
fn is_zero(&self) -> bool { self.len() == 0 }
}
impl<A> Zero for @[A] {
fn zero() -> @[A] { @[] }
fn is_zero(&self) -> bool { self.len() == 0 }
}
macro_rules! iterator {
/* FIXME: #4375 Cannot attach documentation/attributes to a macro generated struct.
(struct $name:ident -> $ptr:ty, $elem:ty) => {