diff --git a/src/libcore/char.rs b/src/libcore/char.rs index 8403c621608..b656879e7a4 100644 --- a/src/libcore/char.rs +++ b/src/libcore/char.rs @@ -64,6 +64,7 @@ pub use is_XID_continue = unicode::derived_property::XID_Continue; * Indicates whether a character is in lower case, defined * in terms of the Unicode General Category 'Ll' */ +#[inline(always)] pub pure fn is_lowercase(c: char) -> bool { return unicode::general_category::Ll(c); } @@ -72,6 +73,7 @@ pub pure fn is_lowercase(c: char) -> bool { * Indicates whether a character is in upper case, defined * in terms of the Unicode General Category 'Lu'. */ +#[inline(always)] pub pure fn is_uppercase(c: char) -> bool { return unicode::general_category::Lu(c); } @@ -81,6 +83,7 @@ pub pure fn is_uppercase(c: char) -> bool { * terms of the Unicode General Categories 'Zs', 'Zl', 'Zp' * additional 'Cc'-category control codes in the range [0x09, 0x0d] */ +#[inline(always)] pub pure fn is_whitespace(c: char) -> bool { return ('\x09' <= c && c <= '\x0d') || unicode::general_category::Zs(c) @@ -93,6 +96,7 @@ pub pure fn is_whitespace(c: char) -> bool { * defined in terms of the Unicode General Categories 'Nd', 'Nl', 'No' * and the Derived Core Property 'Alphabetic'. */ +#[inline(always)] pub pure fn is_alphanumeric(c: char) -> bool { return unicode::derived_property::Alphabetic(c) || unicode::general_category::Nd(c) || @@ -101,11 +105,13 @@ pub pure fn is_alphanumeric(c: char) -> bool { } /// Indicates whether the character is an ASCII character +#[inline(always)] pub pure fn is_ascii(c: char) -> bool { c - ('\x7F' & c) == '\x00' } /// Indicates whether the character is numeric (Nd, Nl, or No) +#[inline(always)] pub pure fn is_digit(c: char) -> bool { return unicode::general_category::Nd(c) || unicode::general_category::Nl(c) || @@ -122,6 +128,7 @@ pub pure fn is_digit(c: char) -> bool { * 'b' or 'B', 11, etc. Returns none if the char does not * refer to a digit in the given radix. */ +#[inline] pub pure fn to_digit(c: char, radix: uint) -> Option<uint> { let val = match c { '0' .. '9' => c as uint - ('0' as uint), @@ -190,6 +197,7 @@ pub pure fn escape_default(c: char) -> ~str { * * -1 if a < b, 0 if a == b, +1 if a > b */ +#[inline(always)] pub pure fn cmp(a: char, b: char) -> int { return if b > a { -1 } else if b < a { 1 } diff --git a/src/libcore/clone.rs b/src/libcore/clone.rs index a0569348b2e..6fbcf2df454 100644 --- a/src/libcore/clone.rs +++ b/src/libcore/clone.rs @@ -16,5 +16,6 @@ pub trait Clone { } impl (): Clone { + #[inline(always)] fn clone(&self) -> () { () } } diff --git a/src/libcore/cmp.rs b/src/libcore/cmp.rs index 0f9e12058ba..141b6f19ab4 100644 --- a/src/libcore/cmp.rs +++ b/src/libcore/cmp.rs @@ -53,26 +53,32 @@ pub trait Ord { pure fn gt(&self, other: &self) -> bool; } +#[inline(always)] pub pure fn lt<T: Ord>(v1: &T, v2: &T) -> bool { (*v1).lt(v2) } +#[inline(always)] pub pure fn le<T: Ord Eq>(v1: &T, v2: &T) -> bool { (*v1).lt(v2) || (*v1).eq(v2) } +#[inline(always)] pub pure fn eq<T: Eq>(v1: &T, v2: &T) -> bool { (*v1).eq(v2) } +#[inline(always)] pub pure fn ne<T: Eq>(v1: &T, v2: &T) -> bool { (*v1).ne(v2) } +#[inline(always)] pub pure fn ge<T: Ord>(v1: &T, v2: &T) -> bool { (*v1).ge(v2) } +#[inline(always)] pub pure fn gt<T: Ord>(v1: &T, v2: &T) -> bool { (*v1).gt(v2) } diff --git a/src/libcore/either.rs b/src/libcore/either.rs index 4902edcedb1..c4f07db6621 100644 --- a/src/libcore/either.rs +++ b/src/libcore/either.rs @@ -28,6 +28,7 @@ pub enum Either<T, U> { Right(U) } +#[inline(always)] pub fn either<T, U, V>(f_left: fn(&T) -> V, f_right: fn(&U) -> V, value: &Either<T, U>) -> V { /*! @@ -90,6 +91,7 @@ pub fn partition<T, U>(eithers: ~[Either<T, U>]) return (move lefts, move rights); } +#[inline(always)] pub pure fn flip<T, U>(eith: Either<T, U>) -> Either<U, T> { //! Flips between left and right of a given either @@ -99,6 +101,7 @@ pub pure fn flip<T, U>(eith: Either<T, U>) -> Either<U, T> { } } +#[inline(always)] pub pure fn to_result<T, U>(eith: Either<T, U>) -> Result<U, T> { /*! @@ -114,18 +117,21 @@ pub pure fn to_result<T, U>(eith: Either<T, U>) } } +#[inline(always)] pub pure fn is_left<T, U>(eith: &Either<T, U>) -> bool { //! Checks whether the given value is a left match *eith { Left(_) => true, _ => false } } +#[inline(always)] pub pure fn is_right<T, U>(eith: &Either<T, U>) -> bool { //! Checks whether the given value is a right match *eith { Right(_) => true, _ => false } } +#[inline(always)] pub pure fn unwrap_left<T,U>(eith: Either<T,U>) -> T { //! Retrieves the value in the left branch. Fails if the either is Right. @@ -134,6 +140,7 @@ pub pure fn unwrap_left<T,U>(eith: Either<T,U>) -> T { } } +#[inline(always)] pub pure fn unwrap_right<T,U>(eith: Either<T,U>) -> U { //! Retrieves the value in the right branch. Fails if the either is Left. diff --git a/src/libcore/f32.rs b/src/libcore/f32.rs index 734cfc11080..4c1cc890de9 100644 --- a/src/libcore/f32.rs +++ b/src/libcore/f32.rs @@ -105,38 +105,52 @@ pub const infinity: f32 = 1.0_f32/0.0_f32; pub const neg_infinity: f32 = -1.0_f32/0.0_f32; +#[inline(always)] pub pure fn is_NaN(f: f32) -> bool { f != f } +#[inline(always)] pub pure fn add(x: f32, y: f32) -> f32 { return x + y; } +#[inline(always)] pub pure fn sub(x: f32, y: f32) -> f32 { return x - y; } +#[inline(always)] pub pure fn mul(x: f32, y: f32) -> f32 { return x * y; } +#[inline(always)] pub pure fn div(x: f32, y: f32) -> f32 { return x / y; } +#[inline(always)] pub pure fn rem(x: f32, y: f32) -> f32 { return x % y; } +#[inline(always)] pub pure fn lt(x: f32, y: f32) -> bool { return x < y; } +#[inline(always)] pub pure fn le(x: f32, y: f32) -> bool { return x <= y; } +#[inline(always)] pub pure fn eq(x: f32, y: f32) -> bool { return x == y; } +#[inline(always)] pub pure fn ne(x: f32, y: f32) -> bool { return x != y; } +#[inline(always)] pub pure fn ge(x: f32, y: f32) -> bool { return x >= y; } +#[inline(always)] pub pure fn gt(x: f32, y: f32) -> bool { return x > y; } // FIXME (#1999): replace the predicates below with llvm intrinsics or // calls to the libmath macros in the rust runtime for performance. /// Returns true if `x` is a positive number, including +0.0f320 and +Infinity +#[inline(always)] pub pure fn is_positive(x: f32) -> bool { return x > 0.0f32 || (1.0f32/x) == infinity; } /// Returns true if `x` is a negative number, including -0.0f320 and -Infinity +#[inline(always)] pub pure fn is_negative(x: f32) -> bool { return x < 0.0f32 || (1.0f32/x) == neg_infinity; } @@ -145,6 +159,7 @@ pub pure fn is_negative(x: f32) -> bool * * This is the same as `f32::is_negative`. */ +#[inline(always)] pub pure fn is_nonpositive(x: f32) -> bool { return x < 0.0f32 || (1.0f32/x) == neg_infinity; } @@ -154,21 +169,25 @@ pub pure fn is_nonpositive(x: f32) -> bool { * * This is the same as `f32::is_positive`.) */ +#[inline(always)] pub pure fn is_nonnegative(x: f32) -> bool { return x > 0.0f32 || (1.0f32/x) == infinity; } /// Returns true if `x` is a zero number (positive or negative zero) +#[inline(always)] pub pure fn is_zero(x: f32) -> bool { return x == 0.0f32 || x == -0.0f32; } /// Returns true if `x`is an infinite number +#[inline(always)] pub pure fn is_infinite(x: f32) -> bool { return x == infinity || x == neg_infinity; } /// Returns true if `x`is a finite number +#[inline(always)] pub pure fn is_finite(x: f32) -> bool { return !(is_NaN(x) || is_infinite(x)); } @@ -219,45 +238,63 @@ pub mod consts { pub const ln_10: f32 = 2.30258509299404568401799145468436421_f32; } +#[inline(always)] pub pure fn signbit(x: f32) -> int { if is_negative(x) { return 1; } else { return 0; } } +#[inline(always)] pub pure fn logarithm(n: f32, b: f32) -> f32 { return log2(n) / log2(b); } #[cfg(notest)] impl f32 : cmp::Eq { + #[inline(always)] pure fn eq(&self, other: &f32) -> bool { (*self) == (*other) } + #[inline(always)] pure fn ne(&self, other: &f32) -> bool { (*self) != (*other) } } #[cfg(notest)] impl f32 : cmp::Ord { + #[inline(always)] pure fn lt(&self, other: &f32) -> bool { (*self) < (*other) } + #[inline(always)] pure fn le(&self, other: &f32) -> bool { (*self) <= (*other) } + #[inline(always)] pure fn ge(&self, other: &f32) -> bool { (*self) >= (*other) } + #[inline(always)] pure fn gt(&self, other: &f32) -> bool { (*self) > (*other) } } impl f32: num::Num { + #[inline(always)] pure fn add(&self, other: &f32) -> f32 { return *self + *other; } + #[inline(always)] pure fn sub(&self, other: &f32) -> f32 { return *self - *other; } + #[inline(always)] pure fn mul(&self, other: &f32) -> f32 { return *self * *other; } + #[inline(always)] pure fn div(&self, other: &f32) -> f32 { return *self / *other; } + #[inline(always)] pure fn modulo(&self, other: &f32) -> f32 { return *self % *other; } + #[inline(always)] pure fn neg(&self) -> f32 { return -*self; } + #[inline(always)] pure fn to_int(&self) -> int { return *self as int; } + #[inline(always)] static pure fn from_int(n: int) -> f32 { return n as f32; } } impl f32: num::Zero { + #[inline(always)] static pure fn zero() -> f32 { 0.0 } } impl f32: num::One { + #[inline(always)] static pure fn one() -> f32 { 1.0 } } diff --git a/src/libcore/f64.rs b/src/libcore/f64.rs index e0c47b509f1..cbcdc2e81e6 100644 --- a/src/libcore/f64.rs +++ b/src/libcore/f64.rs @@ -132,35 +132,49 @@ pub const infinity: f64 = 1.0_f64/0.0_f64; pub const neg_infinity: f64 = -1.0_f64/0.0_f64; +#[inline(always)] pub pure fn is_NaN(f: f64) -> bool { f != f } +#[inline(always)] pub pure fn add(x: f64, y: f64) -> f64 { return x + y; } +#[inline(always)] pub pure fn sub(x: f64, y: f64) -> f64 { return x - y; } +#[inline(always)] pub pure fn mul(x: f64, y: f64) -> f64 { return x * y; } +#[inline(always)] pub pure fn div(x: f64, y: f64) -> f64 { return x / y; } +#[inline(always)] pub pure fn rem(x: f64, y: f64) -> f64 { return x % y; } +#[inline(always)] pub pure fn lt(x: f64, y: f64) -> bool { return x < y; } +#[inline(always)] pub pure fn le(x: f64, y: f64) -> bool { return x <= y; } +#[inline(always)] pub pure fn eq(x: f64, y: f64) -> bool { return x == y; } +#[inline(always)] pub pure fn ne(x: f64, y: f64) -> bool { return x != y; } +#[inline(always)] pub pure fn ge(x: f64, y: f64) -> bool { return x >= y; } +#[inline(always)] pub pure fn gt(x: f64, y: f64) -> bool { return x > y; } /// Returns true if `x` is a positive number, including +0.0f640 and +Infinity +#[inline(always)] pub pure fn is_positive(x: f64) -> bool { return x > 0.0f64 || (1.0f64/x) == infinity; } /// Returns true if `x` is a negative number, including -0.0f640 and -Infinity +#[inline(always)] pub pure fn is_negative(x: f64) -> bool { return x < 0.0f64 || (1.0f64/x) == neg_infinity; } @@ -169,6 +183,7 @@ pub pure fn is_negative(x: f64) -> bool * * This is the same as `f64::is_negative`. */ +#[inline(always)] pub pure fn is_nonpositive(x: f64) -> bool { return x < 0.0f64 || (1.0f64/x) == neg_infinity; } @@ -178,21 +193,25 @@ pub pure fn is_nonpositive(x: f64) -> bool { * * This is the same as `f64::positive`. */ +#[inline(always)] pub pure fn is_nonnegative(x: f64) -> bool { return x > 0.0f64 || (1.0f64/x) == infinity; } /// Returns true if `x` is a zero number (positive or negative zero) +#[inline(always)] pub pure fn is_zero(x: f64) -> bool { return x == 0.0f64 || x == -0.0f64; } /// Returns true if `x`is an infinite number +#[inline(always)] pub pure fn is_infinite(x: f64) -> bool { return x == infinity || x == neg_infinity; } /// Returns true if `x`is a finite number +#[inline(always)] pub pure fn is_finite(x: f64) -> bool { return !(is_NaN(x) || is_infinite(x)); } @@ -243,45 +262,63 @@ pub mod consts { pub const ln_10: f64 = 2.30258509299404568401799145468436421_f64; } +#[inline(always)] pub pure fn signbit(x: f64) -> int { if is_negative(x) { return 1; } else { return 0; } } +#[inline(always)] pub pure fn logarithm(n: f64, b: f64) -> f64 { return log2(n) / log2(b); } #[cfg(notest)] impl f64 : cmp::Eq { + #[inline(always)] pure fn eq(&self, other: &f64) -> bool { (*self) == (*other) } + #[inline(always)] pure fn ne(&self, other: &f64) -> bool { (*self) != (*other) } } #[cfg(notest)] impl f64 : cmp::Ord { + #[inline(always)] pure fn lt(&self, other: &f64) -> bool { (*self) < (*other) } + #[inline(always)] pure fn le(&self, other: &f64) -> bool { (*self) <= (*other) } + #[inline(always)] pure fn ge(&self, other: &f64) -> bool { (*self) >= (*other) } + #[inline(always)] pure fn gt(&self, other: &f64) -> bool { (*self) > (*other) } } impl f64: num::Num { + #[inline(always)] pure fn add(&self, other: &f64) -> f64 { return *self + *other; } + #[inline(always)] pure fn sub(&self, other: &f64) -> f64 { return *self - *other; } + #[inline(always)] pure fn mul(&self, other: &f64) -> f64 { return *self * *other; } + #[inline(always)] pure fn div(&self, other: &f64) -> f64 { return *self / *other; } + #[inline(always)] pure fn modulo(&self, other: &f64) -> f64 { return *self % *other; } + #[inline(always)] pure fn neg(&self) -> f64 { return -*self; } + #[inline(always)] pure fn to_int(&self) -> int { return *self as int; } + #[inline(always)] static pure fn from_int(n: int) -> f64 { return n as f64; } } impl f64: num::Zero { + #[inline(always)] static pure fn zero() -> f64 { 0.0 } } impl f64: num::One { + #[inline(always)] static pure fn one() -> f64 { 1.0 } } diff --git a/src/libcore/float.rs b/src/libcore/float.rs index 92efe9c4981..4c79069ad09 100644 --- a/src/libcore/float.rs +++ b/src/libcore/float.rs @@ -195,6 +195,7 @@ pub pure fn to_str_common(num: float, digits: uint, exact: bool) -> ~str { * * num - The float value * * digits - The number of significant digits */ +#[inline(always)] pub pure fn to_str_exact(num: float, digits: uint) -> ~str { to_str_common(num, digits, true) } @@ -215,6 +216,7 @@ pub fn test_to_str_exact_do_decimal() { * * num - The float value * * digits - The number of significant digits */ +#[inline(always)] pub pure fn to_str(num: float, digits: uint) -> ~str { to_str_common(num, digits, false) } @@ -400,30 +402,44 @@ pub pure fn pow_with_uint(base: uint, pow: uint) -> float { return total; } +#[inline(always)] pub pure fn is_positive(x: float) -> bool { f64::is_positive(x as f64) } +#[inline(always)] pub pure fn is_negative(x: float) -> bool { f64::is_negative(x as f64) } +#[inline(always)] pub pure fn is_nonpositive(x: float) -> bool { f64::is_nonpositive(x as f64) } +#[inline(always)] pub pure fn is_nonnegative(x: float) -> bool { f64::is_nonnegative(x as f64) } +#[inline(always)] pub pure fn is_zero(x: float) -> bool { f64::is_zero(x as f64) } +#[inline(always)] pub pure fn is_infinite(x: float) -> bool { f64::is_infinite(x as f64) } +#[inline(always)] pub pure fn is_finite(x: float) -> bool { f64::is_finite(x as f64) } +#[inline(always)] pub pure fn is_NaN(x: float) -> bool { f64::is_NaN(x as f64) } +#[inline(always)] pub pure fn abs(x: float) -> float { unsafe { f64::abs(x as f64) as float } } +#[inline(always)] pub pure fn sqrt(x: float) -> float { unsafe { f64::sqrt(x as f64) as float } } +#[inline(always)] pub pure fn atan(x: float) -> float { unsafe { f64::atan(x as f64) as float } } +#[inline(always)] pub pure fn sin(x: float) -> float { unsafe { f64::sin(x as f64) as float } } +#[inline(always)] pub pure fn cos(x: float) -> float { unsafe { f64::cos(x as f64) as float } } +#[inline(always)] pub pure fn tan(x: float) -> float { unsafe { f64::tan(x as f64) as float } } @@ -463,10 +479,12 @@ impl float: num::Num { } impl float: num::Zero { + #[inline(always)] static pure fn zero() -> float { 0.0 } } impl float: num::One { + #[inline(always)] static pure fn one() -> float { 1.0 } } diff --git a/src/libcore/int-template.rs b/src/libcore/int-template.rs index 4946a0997c1..a04610d1995 100644 --- a/src/libcore/int-template.rs +++ b/src/libcore/int-template.rs @@ -32,25 +32,42 @@ pub const bytes : uint = (inst::bits / 8); pub const min_value: T = (-1 as T) << (bits - 1); pub const max_value: T = min_value - 1 as T; +#[inline(always)] pub pure fn min(x: T, y: T) -> T { if x < y { x } else { y } } +#[inline(always)] pub pure fn max(x: T, y: T) -> T { if x > y { x } else { y } } +#[inline(always)] pub pure fn add(x: T, y: T) -> T { x + y } +#[inline(always)] pub pure fn sub(x: T, y: T) -> T { x - y } +#[inline(always)] pub pure fn mul(x: T, y: T) -> T { x * y } +#[inline(always)] pub pure fn div(x: T, y: T) -> T { x / y } +#[inline(always)] pub pure fn rem(x: T, y: T) -> T { x % y } +#[inline(always)] pub pure fn lt(x: T, y: T) -> bool { x < y } +#[inline(always)] pub pure fn le(x: T, y: T) -> bool { x <= y } +#[inline(always)] pub pure fn eq(x: T, y: T) -> bool { x == y } +#[inline(always)] pub pure fn ne(x: T, y: T) -> bool { x != y } +#[inline(always)] pub pure fn ge(x: T, y: T) -> bool { x >= y } +#[inline(always)] pub pure fn gt(x: T, y: T) -> bool { x > y } +#[inline(always)] pub pure fn is_positive(x: T) -> bool { x > 0 as T } +#[inline(always)] pub pure fn is_negative(x: T) -> bool { x < 0 as T } +#[inline(always)] pub pure fn is_nonpositive(x: T) -> bool { x <= 0 as T } +#[inline(always)] pub pure fn is_nonnegative(x: T) -> bool { x >= 0 as T } #[inline(always)] @@ -64,46 +81,64 @@ pub fn range(lo: T, hi: T, it: fn(T) -> bool) { } /// Computes the bitwise complement +#[inline(always)] pub pure fn compl(i: T) -> T { -1 as T ^ i } /// Computes the absolute value +#[inline(always)] pub pure fn abs(i: T) -> T { if is_negative(i) { -i } else { i } } #[cfg(notest)] impl T : Ord { + #[inline(always)] pure fn lt(&self, other: &T) -> bool { return (*self) < (*other); } + #[inline(always)] pure fn le(&self, other: &T) -> bool { return (*self) <= (*other); } + #[inline(always)] pure fn ge(&self, other: &T) -> bool { return (*self) >= (*other); } + #[inline(always)] pure fn gt(&self, other: &T) -> bool { return (*self) > (*other); } } #[cfg(notest)] impl T : Eq { + #[inline(always)] pure fn eq(&self, other: &T) -> bool { return (*self) == (*other); } + #[inline(always)] pure fn ne(&self, other: &T) -> bool { return (*self) != (*other); } } impl T: num::Num { + #[inline(always)] pure fn add(&self, other: &T) -> T { return *self + *other; } + #[inline(always)] pure fn sub(&self, other: &T) -> T { return *self - *other; } + #[inline(always)] pure fn mul(&self, other: &T) -> T { return *self * *other; } + #[inline(always)] pure fn div(&self, other: &T) -> T { return *self / *other; } + #[inline(always)] pure fn modulo(&self, other: &T) -> T { return *self % *other; } + #[inline(always)] pure fn neg(&self) -> T { return -*self; } + #[inline(always)] pure fn to_int(&self) -> int { return *self as int; } + #[inline(always)] static pure fn from_int(n: int) -> T { return n as T; } } impl T: num::Zero { + #[inline(always)] static pure fn zero() -> T { 0 } } impl T: num::One { + #[inline(always)] static pure fn one() -> T { 1 } } @@ -158,16 +193,19 @@ pub pure fn parse_bytes(buf: &[u8], radix: uint) -> Option<T> { } /// Parse a string to an int +#[inline(always)] pub pure fn from_str(s: &str) -> Option<T> { parse_bytes(str::to_bytes(s), 10u) } impl T : FromStr { + #[inline(always)] static pure fn from_str(s: &str) -> Option<T> { from_str(s) } } /// Convert to a string in a given base +#[inline(always)] pub pure fn to_str(n: T, radix: uint) -> ~str { do to_str_bytes(n, radix) |slice| { do vec::as_imm_buf(slice) |p, len| { @@ -176,6 +214,7 @@ pub pure fn to_str(n: T, radix: uint) -> ~str { } } +#[inline(always)] pub pure fn to_str_bytes<U>(n: T, radix: uint, f: fn(v: &[u8]) -> U) -> U { if n < 0 as T { uint::to_str_bytes(true, -n as uint, radix, f) @@ -185,6 +224,7 @@ pub pure fn to_str_bytes<U>(n: T, radix: uint, f: fn(v: &[u8]) -> U) -> U { } /// Convert to a string +#[inline(always)] pub pure fn str(i: T) -> ~str { return to_str(i, 10u); } #[test] diff --git a/src/libcore/iter-trait.rs b/src/libcore/iter-trait.rs index a139daddcef..942db1c5f29 100644 --- a/src/libcore/iter-trait.rs +++ b/src/libcore/iter-trait.rs @@ -24,29 +24,38 @@ use option::Option; use self::inst::{IMPL_T, EACH, SIZE_HINT}; impl<A> IMPL_T<A>: iter::BaseIter<A> { + #[inline(always)] pure fn each(&self, blk: fn(v: &A) -> bool) { EACH(self, blk) } + #[inline(always)] pure fn size_hint(&self) -> Option<uint> { SIZE_HINT(self) } } impl<A> IMPL_T<A>: iter::ExtendedIter<A> { + #[inline(always)] pure fn eachi(&self, blk: fn(uint, v: &A) -> bool) { iter::eachi(self, blk) } + #[inline(always)] pure fn all(&self, blk: fn(&A) -> bool) -> bool { iter::all(self, blk) } + #[inline(always)] pure fn any(&self, blk: fn(&A) -> bool) -> bool { iter::any(self, blk) } + #[inline(always)] pure fn foldl<B>(&self, b0: B, blk: fn(&B, &A) -> B) -> B { iter::foldl(self, move b0, blk) } + #[inline(always)] pure fn position(&self, f: fn(&A) -> bool) -> Option<uint> { iter::position(self, f) } + #[inline(always)] pure fn map_to_vec<B>(&self, op: fn(&A) -> B) -> ~[B] { iter::map_to_vec(self, op) } + #[inline(always)] pure fn flat_map_to_vec<B,IB:BaseIter<B>>(&self, op: fn(&A) -> IB) -> ~[B] { iter::flat_map_to_vec(self, op) @@ -55,22 +64,29 @@ impl<A> IMPL_T<A>: iter::ExtendedIter<A> { } impl<A: Eq> IMPL_T<A>: iter::EqIter<A> { + #[inline(always)] pure fn contains(&self, x: &A) -> bool { iter::contains(self, x) } + #[inline(always)] pure fn count(&self, x: &A) -> uint { iter::count(self, x) } } impl<A: Copy> IMPL_T<A>: iter::CopyableIter<A> { + #[inline(always)] pure fn filter_to_vec(&self, pred: fn(&A) -> bool) -> ~[A] { iter::filter_to_vec(self, pred) } + #[inline(always)] pure fn to_vec(&self) -> ~[A] { iter::to_vec(self) } + #[inline(always)] pure fn find(&self, f: fn(&A) -> bool) -> Option<A> { iter::find(self, f) } } impl<A: Copy Ord> IMPL_T<A>: iter::CopyableOrderedIter<A> { + #[inline(always)] pure fn min(&self) -> A { iter::min(self) } + #[inline(always)] pure fn max(&self) -> A { iter::max(self) } } diff --git a/src/libcore/iter-trait/dlist.rs b/src/libcore/iter-trait/dlist.rs index eb395c57ae8..754b8f8b72f 100644 --- a/src/libcore/iter-trait/dlist.rs +++ b/src/libcore/iter-trait/dlist.rs @@ -47,6 +47,7 @@ mod inst { } } + #[inline(always)] pub pure fn SIZE_HINT<A>(self: &IMPL_T<A>) -> Option<uint> { Some(self.len()) } diff --git a/src/libcore/iter-trait/dvec.rs b/src/libcore/iter-trait/dvec.rs index 28d1cf03d46..af788989e9c 100644 --- a/src/libcore/iter-trait/dvec.rs +++ b/src/libcore/iter-trait/dvec.rs @@ -20,6 +20,7 @@ mod inst { * * Attempts to access this dvec during iteration will fail. */ + #[inline(always)] pub pure fn EACH<A>(self: &IMPL_T<A>, f: fn(v: &A) -> bool) { unsafe { do self.swap |v| { @@ -29,6 +30,7 @@ mod inst { } } + #[inline(always)] pub pure fn SIZE_HINT<A>(self: &IMPL_T<A>) -> Option<uint> { Some(self.len()) } diff --git a/src/libcore/iter-trait/option.rs b/src/libcore/iter-trait/option.rs index 2240db82f29..986dbf7f3d1 100644 --- a/src/libcore/iter-trait/option.rs +++ b/src/libcore/iter-trait/option.rs @@ -14,6 +14,7 @@ mod inst { #[allow(non_camel_case_types)] pub type IMPL_T<A> = Option<A>; + #[inline(always)] pub pure fn EACH<A>(self: &IMPL_T<A>, f: fn(v: &A) -> bool) { match *self { None => (), @@ -21,6 +22,7 @@ mod inst { } } + #[inline(always)] pub pure fn SIZE_HINT<A>(self: &IMPL_T<A>) -> Option<uint> { match *self { None => Some(0), diff --git a/src/libcore/iter.rs b/src/libcore/iter.rs index 1e56b0f14af..4ea845543d1 100644 --- a/src/libcore/iter.rs +++ b/src/libcore/iter.rs @@ -88,6 +88,7 @@ pub trait Buildable<A> { builder: fn(push: pure fn(A))) -> self; } +#[inline(always)] pub pure fn eachi<A,IA:BaseIter<A>>(self: &IA, blk: fn(uint, &A) -> bool) { let mut i = 0; @@ -97,6 +98,7 @@ pub pure fn eachi<A,IA:BaseIter<A>>(self: &IA, } } +#[inline(always)] pub pure fn all<A,IA:BaseIter<A>>(self: &IA, blk: fn(&A) -> bool) -> bool { for self.each |a| { @@ -105,6 +107,7 @@ pub pure fn all<A,IA:BaseIter<A>>(self: &IA, return true; } +#[inline(always)] pub pure fn any<A,IA:BaseIter<A>>(self: &IA, blk: fn(&A) -> bool) -> bool { for self.each |a| { @@ -113,6 +116,7 @@ pub pure fn any<A,IA:BaseIter<A>>(self: &IA, return false; } +#[inline(always)] pub pure fn filter_to_vec<A:Copy,IA:BaseIter<A>>( self: &IA, prd: fn(&A) -> bool) -> ~[A] { do vec::build_sized_opt(self.size_hint()) |push| { @@ -122,6 +126,7 @@ pub pure fn filter_to_vec<A:Copy,IA:BaseIter<A>>( } } +#[inline(always)] pub pure fn map_to_vec<A,B,IA:BaseIter<A>>(self: &IA, op: fn(&A) -> B) -> ~[B] { @@ -132,6 +137,7 @@ pub pure fn map_to_vec<A,B,IA:BaseIter<A>>(self: &IA, } } +#[inline(always)] pub pure fn flat_map_to_vec<A,B,IA:BaseIter<A>,IB:BaseIter<B>>( self: &IA, op: fn(&A) -> IB) -> ~[B] { do vec::build |push| { @@ -143,6 +149,7 @@ pub pure fn flat_map_to_vec<A,B,IA:BaseIter<A>,IB:BaseIter<B>>( } } +#[inline(always)] pub pure fn foldl<A,B,IA:BaseIter<A>>(self: &IA, b0: B, blk: fn(&B, &A) -> B) -> B { @@ -153,10 +160,12 @@ pub pure fn foldl<A,B,IA:BaseIter<A>>(self: &IA, b0: B, move b } +#[inline(always)] pub pure fn to_vec<A:Copy,IA:BaseIter<A>>(self: &IA) -> ~[A] { foldl::<A,~[A],IA>(self, ~[], |r, a| vec::append(copy (*r), ~[*a])) } +#[inline(always)] pub pure fn contains<A:Eq,IA:BaseIter<A>>(self: &IA, x: &A) -> bool { for self.each |a| { if *a == *x { return true; } @@ -164,6 +173,7 @@ pub pure fn contains<A:Eq,IA:BaseIter<A>>(self: &IA, x: &A) -> bool { return false; } +#[inline(always)] pub pure fn count<A:Eq,IA:BaseIter<A>>(self: &IA, x: &A) -> uint { do foldl(self, 0) |count, value| { if *value == *x { @@ -174,6 +184,7 @@ pub pure fn count<A:Eq,IA:BaseIter<A>>(self: &IA, x: &A) -> uint { } } +#[inline(always)] pub pure fn position<A,IA:BaseIter<A>>(self: &IA, f: fn(&A) -> bool) -> Option<uint> { @@ -189,6 +200,7 @@ pub pure fn position<A,IA:BaseIter<A>>(self: &IA, f: fn(&A) -> bool) // iter interface, such as would provide "reach" in addition to "each". as is, // it would have to be implemented with foldr, which is too inefficient. +#[inline(always)] pub pure fn repeat(times: uint, blk: fn() -> bool) { let mut i = 0; while i < times { @@ -197,6 +209,7 @@ pub pure fn repeat(times: uint, blk: fn() -> bool) { } } +#[inline(always)] pub pure fn min<A:Copy Ord,IA:BaseIter<A>>(self: &IA) -> A { match do foldl::<A,Option<A>,IA>(self, None) |a, b| { match a { @@ -211,6 +224,7 @@ pub pure fn min<A:Copy Ord,IA:BaseIter<A>>(self: &IA) -> A { } } +#[inline(always)] pub pure fn max<A:Copy Ord,IA:BaseIter<A>>(self: &IA) -> A { match do foldl::<A,Option<A>,IA>(self, None) |a, b| { match a { @@ -225,6 +239,7 @@ pub pure fn max<A:Copy Ord,IA:BaseIter<A>>(self: &IA) -> A { } } +#[inline(always)] pub pure fn find<A: Copy,IA:BaseIter<A>>(self: &IA, f: fn(&A) -> bool) -> Option<A> { for self.each |i| { @@ -275,6 +290,7 @@ pub pure fn build_sized_opt<A,B: Buildable<A>>( // Functions that combine iteration and building /// Apply a function to each element of an iterable and return the results +#[inline(always)] pub fn map<T,IT: BaseIter<T>,U,BU: Buildable<U>>(v: &IT, f: fn(&T) -> U) -> BU { do build_sized_opt(v.size_hint()) |push| { @@ -290,6 +306,7 @@ pub fn map<T,IT: BaseIter<T>,U,BU: Buildable<U>>(v: &IT, f: fn(&T) -> U) * Creates a generic sequence of size `n_elts` and initializes the elements * to the value returned by the function `op`. */ +#[inline(always)] pub pure fn from_fn<T,BT: Buildable<T>>(n_elts: uint, op: InitOp<T>) -> BT { do Buildable::build_sized(n_elts) |push| { @@ -304,6 +321,7 @@ pub pure fn from_fn<T,BT: Buildable<T>>(n_elts: uint, * Creates an immutable vector of size `n_elts` and initializes the elements * to the value `t`. */ +#[inline(always)] pub pure fn from_elem<T: Copy,BT: Buildable<T>>(n_elts: uint, t: T) -> BT { do Buildable::build_sized(n_elts) |push| { diff --git a/src/libcore/managed.rs b/src/libcore/managed.rs index b334d246743..8395526276c 100644 --- a/src/libcore/managed.rs +++ b/src/libcore/managed.rs @@ -35,6 +35,7 @@ pub mod raw { } +#[inline(always)] pub pure fn ptr_eq<T>(a: @T, b: @T) -> bool { //! Determine if two shared boxes point to the same object unsafe { ptr::addr_of(&(*a)) == ptr::addr_of(&(*b)) } @@ -42,15 +43,21 @@ pub pure fn ptr_eq<T>(a: @T, b: @T) -> bool { #[cfg(notest)] impl<T:Eq> @const T : Eq { + #[inline(always)] pure fn eq(&self, other: &@const T) -> bool { *(*self) == *(*other) } + #[inline(always)] pure fn ne(&self, other: &@const T) -> bool { *(*self) != *(*other) } } #[cfg(notest)] impl<T:Ord> @const T : Ord { + #[inline(always)] pure fn lt(&self, other: &@const T) -> bool { *(*self) < *(*other) } + #[inline(always)] pure fn le(&self, other: &@const T) -> bool { *(*self) <= *(*other) } + #[inline(always)] pure fn ge(&self, other: &@const T) -> bool { *(*self) >= *(*other) } + #[inline(always)] pure fn gt(&self, other: &@const T) -> bool { *(*self) > *(*other) } } diff --git a/src/libcore/nil.rs b/src/libcore/nil.rs index 5e306d4b57d..f3eb62a3a3a 100644 --- a/src/libcore/nil.rs +++ b/src/libcore/nil.rs @@ -22,15 +22,21 @@ use cmp::{Eq, Ord}; #[cfg(notest)] impl () : Eq { + #[inline(always)] pure fn eq(&self, _other: &()) -> bool { true } + #[inline(always)] pure fn ne(&self, _other: &()) -> bool { false } } #[cfg(notest)] impl () : Ord { + #[inline(always)] pure fn lt(&self, _other: &()) -> bool { false } + #[inline(always)] pure fn le(&self, _other: &()) -> bool { true } + #[inline(always)] pure fn ge(&self, _other: &()) -> bool { true } + #[inline(always)] pure fn gt(&self, _other: &()) -> bool { false } } diff --git a/src/libcore/option.rs b/src/libcore/option.rs index 49ba10dfffb..414027bb77e 100644 --- a/src/libcore/option.rs +++ b/src/libcore/option.rs @@ -59,6 +59,7 @@ pub enum Option<T> { Some(T), } +#[inline(always)] pub pure fn get<T: Copy>(opt: Option<T>) -> T { /*! Gets the value out of an option @@ -81,6 +82,7 @@ pub pure fn get<T: Copy>(opt: Option<T>) -> T { } } +#[inline(always)] pub pure fn get_ref<T>(opt: &r/Option<T>) -> &r/T { /*! Gets an immutable reference to the value inside an option. @@ -102,12 +104,14 @@ pub pure fn get_ref<T>(opt: &r/Option<T>) -> &r/T { } } +#[inline(always)] pub pure fn map<T, U>(opt: &Option<T>, f: fn(x: &T) -> U) -> Option<U> { //! Maps a `some` value by reference from one type to another match *opt { Some(ref x) => Some(f(x)), None => None } } +#[inline(always)] pub pure fn map_consume<T, U>(opt: Option<T>, f: fn(v: T) -> U) -> Option<U> { /*! @@ -117,6 +121,7 @@ pub pure fn map_consume<T, U>(opt: Option<T>, if opt.is_some() { Some(f(option::unwrap(move opt))) } else { None } } +#[inline(always)] pub pure fn chain<T, U>(opt: Option<T>, f: fn(t: T) -> Option<U>) -> Option<U> { /*! @@ -130,6 +135,7 @@ pub pure fn chain<T, U>(opt: Option<T>, } } +#[inline(always)] pub pure fn chain_ref<T, U>(opt: &Option<T>, f: fn(x: &T) -> Option<U>) -> Option<U> { /*! @@ -140,6 +146,7 @@ pub pure fn chain_ref<T, U>(opt: &Option<T>, match *opt { Some(ref x) => f(x), None => None } } +#[inline(always)] pub pure fn or<T>(opta: Option<T>, optb: Option<T>) -> Option<T> { /*! * Returns the leftmost some() value, or none if both are none. @@ -160,30 +167,35 @@ pub pure fn while_some<T>(x: Option<T>, blk: fn(v: T) -> Option<T>) { } } +#[inline(always)] pub pure fn is_none<T>(opt: &Option<T>) -> bool { //! Returns true if the option equals `none` match *opt { None => true, Some(_) => false } } +#[inline(always)] pub pure fn is_some<T>(opt: &Option<T>) -> bool { //! Returns true if the option contains some value !is_none(opt) } +#[inline(always)] pub pure fn get_or_zero<T: Copy Zero>(opt: Option<T>) -> T { //! Returns the contained value or zero (for this type) match opt { Some(copy x) => x, None => Zero::zero() } } +#[inline(always)] pub pure fn get_or_default<T: Copy>(opt: Option<T>, def: T) -> T { //! Returns the contained value or a default match opt { Some(copy x) => x, None => def } } +#[inline(always)] pub pure fn map_default<T, U>(opt: &Option<T>, def: U, f: fn(x: &T) -> U) -> U { //! Applies a function to the contained value or returns a default @@ -191,6 +203,7 @@ pub pure fn map_default<T, U>(opt: &Option<T>, def: U, match *opt { None => move def, Some(ref t) => f(t) } } +#[inline(always)] pub pure fn iter<T>(opt: &Option<T>, f: fn(x: &T)) { //! Performs an operation on the contained value by reference match *opt { None => (), Some(ref t) => f(t) } @@ -234,6 +247,7 @@ pub fn swap_unwrap<T>(opt: &mut Option<T>) -> T { unwrap(util::replace(opt, None)) } +#[inline(always)] pub pure fn expect<T>(opt: Option<T>, reason: &str) -> T { //! As unwrap, but with a specified failure message. match move opt { diff --git a/src/libcore/owned.rs b/src/libcore/owned.rs index 2f369e18fd1..fb14820113e 100644 --- a/src/libcore/owned.rs +++ b/src/libcore/owned.rs @@ -18,15 +18,21 @@ use cmp::{Eq, Ord}; #[cfg(notest)] impl<T:Eq> ~const T : Eq { + #[inline(always)] pure fn eq(&self, other: &~const T) -> bool { *(*self) == *(*other) } + #[inline(always)] pure fn ne(&self, other: &~const T) -> bool { *(*self) != *(*other) } } #[cfg(notest)] impl<T:Ord> ~const T : Ord { + #[inline(always)] pure fn lt(&self, other: &~const T) -> bool { *(*self) < *(*other) } + #[inline(always)] pure fn le(&self, other: &~const T) -> bool { *(*self) <= *(*other) } + #[inline(always)] pure fn ge(&self, other: &~const T) -> bool { *(*self) >= *(*other) } + #[inline(always)] pure fn gt(&self, other: &~const T) -> bool { *(*self) > *(*other) } } diff --git a/src/libcore/ptr.rs b/src/libcore/ptr.rs index d8c3c74ba2e..33770d727f9 100644 --- a/src/libcore/ptr.rs +++ b/src/libcore/ptr.rs @@ -108,9 +108,11 @@ pub pure fn null<T>() -> *T { unsafe { cast::reinterpret_cast(&0u) } } pub pure fn mut_null<T>() -> *mut T { unsafe { cast::reinterpret_cast(&0u) } } /// Returns true if the pointer is equal to the null pointer. +#[inline(always)] pub pure fn is_null<T>(ptr: *const T) -> bool { ptr == null() } /// Returns true if the pointer is not equal to the null pointer. +#[inline(always)] pub pure fn is_not_null<T>(ptr: *const T) -> bool { !is_null(ptr) } /** @@ -231,32 +233,38 @@ impl<T> *mut T: Ptr<T> { // Equality for pointers #[cfg(notest)] impl<T> *const T : Eq { + #[inline(always)] pure fn eq(&self, other: &*const T) -> bool unsafe { let a: uint = cast::reinterpret_cast(&(*self)); let b: uint = cast::reinterpret_cast(&(*other)); return a == b; } + #[inline(always)] pure fn ne(&self, other: &*const T) -> bool { !(*self).eq(other) } } // Comparison for pointers #[cfg(notest)] impl<T> *const T : Ord { + #[inline(always)] pure fn lt(&self, other: &*const T) -> bool unsafe { let a: uint = cast::reinterpret_cast(&(*self)); let b: uint = cast::reinterpret_cast(&(*other)); return a < b; } + #[inline(always)] pure fn le(&self, other: &*const T) -> bool unsafe { let a: uint = cast::reinterpret_cast(&(*self)); let b: uint = cast::reinterpret_cast(&(*other)); return a <= b; } + #[inline(always)] pure fn ge(&self, other: &*const T) -> bool unsafe { let a: uint = cast::reinterpret_cast(&(*self)); let b: uint = cast::reinterpret_cast(&(*other)); return a >= b; } + #[inline(always)] pure fn gt(&self, other: &*const T) -> bool unsafe { let a: uint = cast::reinterpret_cast(&(*self)); let b: uint = cast::reinterpret_cast(&(*other)); @@ -267,9 +275,11 @@ impl<T> *const T : Ord { // Equality for region pointers #[cfg(notest)] impl<T:Eq> &const T : Eq { + #[inline(always)] pure fn eq(&self, other: & &self/const T) -> bool { return *(*self) == *(*other); } + #[inline(always)] pure fn ne(&self, other: & &self/const T) -> bool { return *(*self) != *(*other); } @@ -278,15 +288,19 @@ impl<T:Eq> &const T : Eq { // Comparison for region pointers #[cfg(notest)] impl<T:Ord> &const T : Ord { + #[inline(always)] pure fn lt(&self, other: & &self/const T) -> bool { *(*self) < *(*other) } + #[inline(always)] pure fn le(&self, other: & &self/const T) -> bool { *(*self) <= *(*other) } + #[inline(always)] pure fn ge(&self, other: & &self/const T) -> bool { *(*self) >= *(*other) } + #[inline(always)] pure fn gt(&self, other: & &self/const T) -> bool { *(*self) > *(*other) } diff --git a/src/libcore/result.rs b/src/libcore/result.rs index 91f51908be8..9a09f1901ff 100644 --- a/src/libcore/result.rs +++ b/src/libcore/result.rs @@ -39,6 +39,7 @@ pub enum Result<T, U> { * * If the result is an error */ +#[inline(always)] pub pure fn get<T: Copy, U>(res: &Result<T, U>) -> T { match *res { Ok(copy t) => t, @@ -55,6 +56,7 @@ pub pure fn get<T: Copy, U>(res: &Result<T, U>) -> T { * * If the result is an error */ +#[inline(always)] pub pure fn get_ref<T, U>(res: &a/Result<T, U>) -> &a/T { match *res { Ok(ref t) => t, @@ -71,6 +73,7 @@ pub pure fn get_ref<T, U>(res: &a/Result<T, U>) -> &a/T { * * If the result is not an error */ +#[inline(always)] pub pure fn get_err<T, U: Copy>(res: &Result<T, U>) -> U { match *res { Err(copy u) => u, @@ -79,6 +82,7 @@ pub pure fn get_err<T, U: Copy>(res: &Result<T, U>) -> U { } /// Returns true if the result is `ok` +#[inline(always)] pub pure fn is_ok<T, U>(res: &Result<T, U>) -> bool { match *res { Ok(_) => true, @@ -87,6 +91,7 @@ pub pure fn is_ok<T, U>(res: &Result<T, U>) -> bool { } /// Returns true if the result is `err` +#[inline(always)] pub pure fn is_err<T, U>(res: &Result<T, U>) -> bool { !is_ok(res) } @@ -97,6 +102,7 @@ pub pure fn is_err<T, U>(res: &Result<T, U>) -> bool { * `ok` result variants are converted to `either::right` variants, `err` * result variants are converted to `either::left`. */ +#[inline(always)] pub pure fn to_either<T: Copy, U: Copy>(res: &Result<U, T>) -> Either<T, U> { match *res { @@ -119,6 +125,7 @@ pub pure fn to_either<T: Copy, U: Copy>(res: &Result<U, T>) * ok(parse_bytes(buf)) * } */ +#[inline(always)] pub pure fn chain<T, U, V>(res: Result<T, V>, op: fn(T) -> Result<U, V>) -> Result<U, V> { match move res { @@ -135,6 +142,7 @@ pub pure fn chain<T, U, V>(res: Result<T, V>, op: fn(T) * immediately returned. This function can be used to pass through a * successful result while handling an error. */ +#[inline(always)] pub pure fn chain_err<T, U, V>( res: Result<T, V>, op: fn(t: V) -> Result<T, U>) @@ -159,6 +167,7 @@ pub pure fn chain_err<T, U, V>( * print_buf(buf) * } */ +#[inline(always)] pub pure fn iter<T, E>(res: &Result<T, E>, f: fn(&T)) { match *res { Ok(ref t) => f(t), @@ -174,6 +183,7 @@ pub pure fn iter<T, E>(res: &Result<T, E>, f: fn(&T)) { * This function can be used to pass through a successful result while * handling an error. */ +#[inline(always)] pub pure fn iter_err<T, E>(res: &Result<T, E>, f: fn(&E)) { match *res { Ok(_) => (), @@ -195,6 +205,7 @@ pub pure fn iter_err<T, E>(res: &Result<T, E>, f: fn(&E)) { * parse_bytes(buf) * } */ +#[inline(always)] pub pure fn map<T, E: Copy, U: Copy>(res: &Result<T, E>, op: fn(&T) -> U) -> Result<U, E> { match *res { @@ -211,6 +222,7 @@ pub pure fn map<T, E: Copy, U: Copy>(res: &Result<T, E>, op: fn(&T) -> U) * is immediately returned. This function can be used to pass through a * successful result while handling an error. */ +#[inline(always)] pub pure fn map_err<T: Copy, E, F: Copy>(res: &Result<T, E>, op: fn(&E) -> F) -> Result<T, F> { match *res { @@ -289,6 +301,7 @@ impl<T, E: Copy> Result<T, E> { * assert incd == ~[2u, 3u, 4u]; * } */ +#[inline(always)] pub fn map_vec<T,U:Copy,V:Copy>( ts: &[T], op: fn(&T) -> Result<V,U>) -> Result<~[V],U> { @@ -302,6 +315,7 @@ pub fn map_vec<T,U:Copy,V:Copy>( return Ok(move vs); } +#[inline(always)] pub fn map_opt<T,U:Copy,V:Copy>( o_t: &Option<T>, op: fn(&T) -> Result<V,U>) -> Result<Option<V>,U> { @@ -323,6 +337,7 @@ pub fn map_opt<T,U:Copy,V:Copy>( * used in 'careful' code contexts where it is both appropriate and easy * to accommodate an error like the vectors being of different lengths. */ +#[inline(always)] pub fn map_vec2<S,T,U:Copy,V:Copy>(ss: &[S], ts: &[T], op: fn(&S,&T) -> Result<V,U>) -> Result<~[V],U> { @@ -345,6 +360,7 @@ pub fn map_vec2<S,T,U:Copy,V:Copy>(ss: &[S], ts: &[T], * error. This could be implemented using `map2()` but it is more efficient * on its own as no result vector is built. */ +#[inline(always)] pub fn iter_vec2<S,T,U:Copy>(ss: &[S], ts: &[T], op: fn(&S,&T) -> Result<(),U>) -> Result<(),U> { diff --git a/src/libcore/to_str.rs b/src/libcore/to_str.rs index fb4ea48ca95..22e187d7768 100644 --- a/src/libcore/to_str.rs +++ b/src/libcore/to_str.rs @@ -25,67 +25,87 @@ use vec; pub trait ToStr { pub pure fn to_str() -> ~str; } impl int: ToStr { + #[inline(always)] pure fn to_str() -> ~str { ::int::str(self) } } impl i8: ToStr { + #[inline(always)] pure fn to_str() -> ~str { ::i8::str(self) } } impl i16: ToStr { + #[inline(always)] pure fn to_str() -> ~str { ::i16::str(self) } } impl i32: ToStr { + #[inline(always)] pure fn to_str() -> ~str { ::i32::str(self) } } impl i64: ToStr { + #[inline(always)] pure fn to_str() -> ~str { ::i64::str(self) } } impl uint: ToStr { + #[inline(always)] pure fn to_str() -> ~str { ::uint::str(self) } } impl u8: ToStr { + #[inline(always)] pure fn to_str() -> ~str { ::u8::str(self) } } impl u16: ToStr { + #[inline(always)] pure fn to_str() -> ~str { ::u16::str(self) } } impl u32: ToStr { + #[inline(always)] pure fn to_str() -> ~str { ::u32::str(self) } } impl u64: ToStr { + #[inline(always)] pure fn to_str() -> ~str { ::u64::str(self) } } impl float: ToStr { + #[inline(always)] pure fn to_str() -> ~str { ::float::to_str(self, 4u) } } impl f32: ToStr { + #[inline(always)] pure fn to_str() -> ~str { ::float::to_str(self as float, 4u) } } impl f64: ToStr { + #[inline(always)] pure fn to_str() -> ~str { ::float::to_str(self as float, 4u) } } impl bool: ToStr { + #[inline(always)] pure fn to_str() -> ~str { ::bool::to_str(self) } } impl (): ToStr { + #[inline(always)] pure fn to_str() -> ~str { ~"()" } } impl ~str: ToStr { + #[inline(always)] pure fn to_str() -> ~str { copy self } } impl &str: ToStr { + #[inline(always)] pure fn to_str() -> ~str { ::str::from_slice(self) } } impl @str: ToStr { + #[inline(always)] pure fn to_str() -> ~str { ::str::from_slice(self) } } impl<A: ToStr Copy, B: ToStr Copy> (A, B): ToStr { + #[inline(always)] pure fn to_str() -> ~str { let (a, b) = self; ~"(" + a.to_str() + ~", " + b.to_str() + ~")" } } impl<A: ToStr Copy, B: ToStr Copy, C: ToStr Copy> (A, B, C): ToStr { + #[inline(always)] pure fn to_str() -> ~str { let (a, b, c) = self; ~"(" + a.to_str() + ~", " + b.to_str() + ~", " + c.to_str() + ~")" @@ -93,6 +113,7 @@ impl<A: ToStr Copy, B: ToStr Copy, C: ToStr Copy> (A, B, C): ToStr { } impl<A: ToStr> ~[A]: ToStr { + #[inline(always)] pure fn to_str() -> ~str unsafe { // Bleh -- not really unsafe // push_str and push_char @@ -108,9 +129,11 @@ impl<A: ToStr> ~[A]: ToStr { } impl<A: ToStr> @A: ToStr { + #[inline(always)] pure fn to_str() -> ~str { ~"@" + (*self).to_str() } } impl<A: ToStr> ~A: ToStr { + #[inline(always)] pure fn to_str() -> ~str { ~"~" + (*self).to_str() } } diff --git a/src/libcore/tuple.rs b/src/libcore/tuple.rs index 6ac7a1a04a3..c497a2f3c7f 100644 --- a/src/libcore/tuple.rs +++ b/src/libcore/tuple.rs @@ -27,18 +27,21 @@ pub trait CopyableTuple<T, U> { impl<T: Copy, U: Copy> (T, U): CopyableTuple<T, U> { /// Return the first element of self + #[inline(always)] pure fn first() -> T { let (t, _) = self; return t; } /// Return the second element of self + #[inline(always)] pure fn second() -> U { let (_, u) = self; return u; } /// Return the results of swapping the two elements of self + #[inline(always)] pure fn swap() -> (U, T) { let (t, u) = self; return (u, t); @@ -52,11 +55,13 @@ pub trait ImmutableTuple<T, U> { } impl<T, U> (T, U): ImmutableTuple<T, U> { + #[inline(always)] pure fn first_ref(&self) -> &self/T { match *self { (ref t, _) => t, } } + #[inline(always)] pure fn second_ref(&self) -> &self/U { match *self { (_, ref u) => u, @@ -70,6 +75,7 @@ pub trait ExtendedTupleOps<A,B> { } impl<A: Copy, B: Copy> (&[A], &[B]): ExtendedTupleOps<A,B> { + #[inline(always)] fn zip(&self) -> ~[(A, B)] { match *self { (ref a, ref b) => { @@ -78,6 +84,7 @@ impl<A: Copy, B: Copy> (&[A], &[B]): ExtendedTupleOps<A,B> { } } + #[inline(always)] fn map<C>(&self, f: &fn(a: &A, b: &B) -> C) -> ~[C] { match *self { (ref a, ref b) => { @@ -89,6 +96,7 @@ impl<A: Copy, B: Copy> (&[A], &[B]): ExtendedTupleOps<A,B> { impl<A: Copy, B: Copy> (~[A], ~[B]): ExtendedTupleOps<A,B> { + #[inline(always)] fn zip(&self) -> ~[(A, B)] { match *self { (ref a, ref b) => { @@ -97,6 +105,7 @@ impl<A: Copy, B: Copy> (~[A], ~[B]): ExtendedTupleOps<A,B> { } } + #[inline(always)] fn map<C>(&self, f: &fn(a: &A, b: &B) -> C) -> ~[C] { match *self { (ref a, ref b) => { @@ -108,6 +117,7 @@ impl<A: Copy, B: Copy> (~[A], ~[B]): ExtendedTupleOps<A,B> { #[cfg(notest)] impl<A: Eq, B: Eq> (A, B) : Eq { + #[inline(always)] pure fn eq(&self, other: &(A, B)) -> bool { match (*self) { (ref self_a, ref self_b) => match other { @@ -117,11 +127,13 @@ impl<A: Eq, B: Eq> (A, B) : Eq { } } } + #[inline(always)] pure fn ne(&self, other: &(A, B)) -> bool { !(*self).eq(other) } } #[cfg(notest)] impl<A: Ord, B: Ord> (A, B) : Ord { + #[inline(always)] pure fn lt(&self, other: &(A, B)) -> bool { match (*self) { (ref self_a, ref self_b) => { @@ -136,13 +148,17 @@ impl<A: Ord, B: Ord> (A, B) : Ord { } } } + #[inline(always)] pure fn le(&self, other: &(A, B)) -> bool { !(*other).lt(&(*self)) } + #[inline(always)] pure fn ge(&self, other: &(A, B)) -> bool { !(*self).lt(other) } + #[inline(always)] pure fn gt(&self, other: &(A, B)) -> bool { (*other).lt(&(*self)) } } #[cfg(notest)] impl<A: Eq, B: Eq, C: Eq> (A, B, C) : Eq { + #[inline(always)] pure fn eq(&self, other: &(A, B, C)) -> bool { match (*self) { (ref self_a, ref self_b, ref self_c) => match other { @@ -153,11 +169,13 @@ impl<A: Eq, B: Eq, C: Eq> (A, B, C) : Eq { } } } + #[inline(always)] pure fn ne(&self, other: &(A, B, C)) -> bool { !(*self).eq(other) } } #[cfg(notest)] impl<A: Ord, B: Ord, C: Ord> (A, B, C) : Ord { + #[inline(always)] pure fn lt(&self, other: &(A, B, C)) -> bool { match (*self) { (ref self_a, ref self_b, ref self_c) => { @@ -174,8 +192,11 @@ impl<A: Ord, B: Ord, C: Ord> (A, B, C) : Ord { } } } + #[inline(always)] pure fn le(&self, other: &(A, B, C)) -> bool { !(*other).lt(&(*self)) } + #[inline(always)] pure fn ge(&self, other: &(A, B, C)) -> bool { !(*self).lt(other) } + #[inline(always)] pure fn gt(&self, other: &(A, B, C)) -> bool { (*other).lt(&(*self)) } } diff --git a/src/libcore/uint-template.rs b/src/libcore/uint-template.rs index ad6f73e56c0..a7eb2f80725 100644 --- a/src/libcore/uint-template.rs +++ b/src/libcore/uint-template.rs @@ -30,25 +30,42 @@ pub const bytes : uint = (inst::bits / 8); pub const min_value: T = 0 as T; pub const max_value: T = 0 as T - 1 as T; +#[inline(always)] pub pure fn min(x: T, y: T) -> T { if x < y { x } else { y } } +#[inline(always)] pub pure fn max(x: T, y: T) -> T { if x > y { x } else { y } } +#[inline(always)] pub pure fn add(x: T, y: T) -> T { x + y } +#[inline(always)] pub pure fn sub(x: T, y: T) -> T { x - y } +#[inline(always)] pub pure fn mul(x: T, y: T) -> T { x * y } +#[inline(always)] pub pure fn div(x: T, y: T) -> T { x / y } +#[inline(always)] pub pure fn rem(x: T, y: T) -> T { x % y } +#[inline(always)] pub pure fn lt(x: T, y: T) -> bool { x < y } +#[inline(always)] pub pure fn le(x: T, y: T) -> bool { x <= y } +#[inline(always)] pub pure fn eq(x: T, y: T) -> bool { x == y } +#[inline(always)] pub pure fn ne(x: T, y: T) -> bool { x != y } +#[inline(always)] pub pure fn ge(x: T, y: T) -> bool { x >= y } +#[inline(always)] pub pure fn gt(x: T, y: T) -> bool { x > y } +#[inline(always)] pub pure fn is_positive(x: T) -> bool { x > 0 as T } +#[inline(always)] pub pure fn is_negative(x: T) -> bool { x < 0 as T } +#[inline(always)] pub pure fn is_nonpositive(x: T) -> bool { x <= 0 as T } +#[inline(always)] pub pure fn is_nonnegative(x: T) -> bool { x >= 0 as T } #[inline(always)] @@ -62,41 +79,58 @@ pub pure fn range(lo: T, hi: T, it: fn(T) -> bool) { } /// Computes the bitwise complement +#[inline(always)] pub pure fn compl(i: T) -> T { max_value ^ i } #[cfg(notest)] impl T : Ord { + #[inline(always)] pure fn lt(&self, other: &T) -> bool { (*self) < (*other) } + #[inline(always)] pure fn le(&self, other: &T) -> bool { (*self) <= (*other) } + #[inline(always)] pure fn ge(&self, other: &T) -> bool { (*self) >= (*other) } + #[inline(always)] pure fn gt(&self, other: &T) -> bool { (*self) > (*other) } } #[cfg(notest)] impl T : Eq { + #[inline(always)] pure fn eq(&self, other: &T) -> bool { return (*self) == (*other); } + #[inline(always)] pure fn ne(&self, other: &T) -> bool { return (*self) != (*other); } } impl T: num::Num { + #[inline(always)] pure fn add(&self, other: &T) -> T { return *self + *other; } + #[inline(always)] pure fn sub(&self, other: &T) -> T { return *self - *other; } + #[inline(always)] pure fn mul(&self, other: &T) -> T { return *self * *other; } + #[inline(always)] pure fn div(&self, other: &T) -> T { return *self / *other; } + #[inline(always)] pure fn modulo(&self, other: &T) -> T { return *self % *other; } + #[inline(always)] pure fn neg(&self) -> T { return -*self; } + #[inline(always)] pure fn to_int(&self) -> int { return *self as int; } + #[inline(always)] static pure fn from_int(n: int) -> T { return n as T; } } impl T: num::Zero { + #[inline(always)] static pure fn zero() -> T { 0 } } impl T: num::One { + #[inline(always)] static pure fn one() -> T { 1 } } @@ -145,12 +179,14 @@ pub pure fn parse_bytes(buf: &[const u8], radix: uint) -> Option<T> { } /// Parse a string to an int +#[inline(always)] pub pure fn from_str(s: &str) -> Option<T> { parse_bytes(str::to_bytes(s), 10u) } impl T : FromStr { + #[inline(always)] static pure fn from_str(s: &str) -> Option<T> { from_str(s) } } @@ -177,6 +213,7 @@ pub fn from_str_radix(buf: &str, radix: u64) -> Option<u64> { * * Fails if `radix` < 2 or `radix` > 16 */ +#[inline(always)] pub pure fn to_str(num: T, radix: uint) -> ~str { do to_str_bytes(false, num, radix) |slice| { do vec::as_imm_buf(slice) |p, len| { @@ -230,6 +267,7 @@ pub pure fn to_str_bytes<U>(neg: bool, num: T, radix: uint, } /// Convert to a string +#[inline(always)] pub pure fn str(i: T) -> ~str { return to_str(i, 10u); } #[test]