Add Zero impls for lots of common types
This commit is contained in:
parent
07f5ab1009
commit
893c70d7bc
@ -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());
|
||||
|
@ -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) {
|
||||
|
@ -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>
|
||||
|
@ -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;
|
||||
|
@ -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())&&+
|
||||
}
|
||||
}
|
||||
)+
|
||||
}
|
||||
}
|
||||
|
@ -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) => {
|
||||
|
Loading…
Reference in New Issue
Block a user