2014-01-25 01:37:51 -06:00
|
|
|
// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
|
2012-12-03 18:48:01 -06:00
|
|
|
// file at the top-level directory of this distribution and at
|
|
|
|
// http://rust-lang.org/COPYRIGHT.
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
|
|
// option. This file may not be copied, modified, or distributed
|
|
|
|
// except according to those terms.
|
|
|
|
|
2014-03-21 20:05:05 -05:00
|
|
|
#![macro_escape]
|
|
|
|
#![doc(hidden)]
|
2013-05-12 20:14:40 -05:00
|
|
|
|
2013-11-29 13:30:31 -06:00
|
|
|
macro_rules! uint_module (($T:ty, $T_SIGNED:ty, $bits:expr) => (
|
2012-04-15 00:07:45 -05:00
|
|
|
|
2014-01-25 01:37:51 -06:00
|
|
|
pub static BITS : uint = $bits;
|
|
|
|
pub static BYTES : uint = ($bits / 8);
|
2012-04-15 00:07:45 -05:00
|
|
|
|
2014-01-25 01:37:51 -06:00
|
|
|
pub static MIN: $T = 0 as $T;
|
|
|
|
pub static MAX: $T = 0 as $T - 1 as $T;
|
2012-04-15 00:07:45 -05:00
|
|
|
|
2013-08-11 17:32:07 -05:00
|
|
|
impl CheckedDiv for $T {
|
|
|
|
#[inline]
|
|
|
|
fn checked_div(&self, v: &$T) -> Option<$T> {
|
|
|
|
if *v == 0 {
|
|
|
|
None
|
|
|
|
} else {
|
|
|
|
Some(self / *v)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-05-12 20:14:40 -05:00
|
|
|
impl Num for $T {}
|
2013-04-24 05:08:08 -05:00
|
|
|
|
2013-05-08 06:11:23 -05:00
|
|
|
#[cfg(not(test))]
|
2013-05-12 20:14:40 -05:00
|
|
|
impl Ord for $T {
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-05-12 20:14:40 -05:00
|
|
|
fn lt(&self, other: &$T) -> bool { (*self) < (*other) }
|
2012-09-19 20:00:26 -05:00
|
|
|
}
|
2012-06-06 16:19:52 -05:00
|
|
|
|
2013-05-08 06:11:23 -05:00
|
|
|
#[cfg(not(test))]
|
2013-05-12 20:14:40 -05:00
|
|
|
impl Eq for $T {
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-05-12 20:14:40 -05:00
|
|
|
fn eq(&self, other: &$T) -> bool { return (*self) == (*other); }
|
2012-09-19 20:00:26 -05:00
|
|
|
}
|
2012-06-06 16:19:52 -05:00
|
|
|
|
2013-09-11 23:49:25 -05:00
|
|
|
impl Default for $T {
|
|
|
|
#[inline]
|
|
|
|
fn default() -> $T { 0 }
|
|
|
|
}
|
|
|
|
|
2013-05-12 20:14:40 -05:00
|
|
|
impl Zero for $T {
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-05-12 20:14:40 -05:00
|
|
|
fn zero() -> $T { 0 }
|
2013-04-25 00:30:56 -05:00
|
|
|
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-04-25 00:30:56 -05:00
|
|
|
fn is_zero(&self) -> bool { *self == 0 }
|
2012-12-20 09:14:38 -06:00
|
|
|
}
|
|
|
|
|
2013-05-12 20:14:40 -05:00
|
|
|
impl One for $T {
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-05-12 20:14:40 -05:00
|
|
|
fn one() -> $T { 1 }
|
2012-12-20 09:14:38 -06:00
|
|
|
}
|
|
|
|
|
2013-05-08 06:11:23 -05:00
|
|
|
#[cfg(not(test))]
|
2013-05-12 20:14:40 -05:00
|
|
|
impl Add<$T,$T> for $T {
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-05-12 20:14:40 -05:00
|
|
|
fn add(&self, other: &$T) -> $T { *self + *other }
|
2013-02-12 19:07:26 -06:00
|
|
|
}
|
2013-04-23 12:56:49 -05:00
|
|
|
|
2013-05-08 06:11:23 -05:00
|
|
|
#[cfg(not(test))]
|
2013-05-12 20:14:40 -05:00
|
|
|
impl Sub<$T,$T> for $T {
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-05-12 20:14:40 -05:00
|
|
|
fn sub(&self, other: &$T) -> $T { *self - *other }
|
2013-02-12 19:07:26 -06:00
|
|
|
}
|
2013-04-23 12:56:49 -05:00
|
|
|
|
2013-05-08 06:11:23 -05:00
|
|
|
#[cfg(not(test))]
|
2013-05-12 20:14:40 -05:00
|
|
|
impl Mul<$T,$T> for $T {
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-05-12 20:14:40 -05:00
|
|
|
fn mul(&self, other: &$T) -> $T { *self * *other }
|
2013-02-12 19:07:26 -06:00
|
|
|
}
|
2013-04-23 12:56:49 -05:00
|
|
|
|
2013-05-08 06:11:23 -05:00
|
|
|
#[cfg(not(test))]
|
2013-05-12 20:14:40 -05:00
|
|
|
impl Div<$T,$T> for $T {
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-05-12 20:14:40 -05:00
|
|
|
fn div(&self, other: &$T) -> $T { *self / *other }
|
2013-02-12 19:07:26 -06:00
|
|
|
}
|
2013-04-23 12:56:49 -05:00
|
|
|
|
2013-05-08 06:11:23 -05:00
|
|
|
#[cfg(not(test))]
|
2013-05-12 20:14:40 -05:00
|
|
|
impl Rem<$T,$T> for $T {
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-05-12 20:14:40 -05:00
|
|
|
fn rem(&self, other: &$T) -> $T { *self % *other }
|
2013-04-21 10:58:53 -05:00
|
|
|
}
|
2013-04-23 12:56:49 -05:00
|
|
|
|
2013-05-08 06:11:23 -05:00
|
|
|
#[cfg(not(test))]
|
2013-05-12 20:14:40 -05:00
|
|
|
impl Neg<$T> for $T {
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-05-12 20:14:40 -05:00
|
|
|
fn neg(&self) -> $T { -*self }
|
2013-02-12 19:07:26 -06:00
|
|
|
}
|
2013-04-18 08:24:24 -05:00
|
|
|
|
2013-05-12 20:14:40 -05:00
|
|
|
impl Unsigned for $T {}
|
2013-04-23 02:59:49 -05:00
|
|
|
|
2013-05-08 06:11:23 -05:00
|
|
|
#[cfg(not(test))]
|
2013-05-12 20:14:40 -05:00
|
|
|
impl BitOr<$T,$T> for $T {
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-05-12 20:14:40 -05:00
|
|
|
fn bitor(&self, other: &$T) -> $T { *self | *other }
|
2013-04-18 05:58:58 -05:00
|
|
|
}
|
2013-04-23 12:56:49 -05:00
|
|
|
|
2013-05-08 06:11:23 -05:00
|
|
|
#[cfg(not(test))]
|
2013-05-12 20:14:40 -05:00
|
|
|
impl BitAnd<$T,$T> for $T {
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-05-12 20:14:40 -05:00
|
|
|
fn bitand(&self, other: &$T) -> $T { *self & *other }
|
2013-04-18 05:58:58 -05:00
|
|
|
}
|
2013-04-23 12:56:49 -05:00
|
|
|
|
2013-05-08 06:11:23 -05:00
|
|
|
#[cfg(not(test))]
|
2013-05-12 20:14:40 -05:00
|
|
|
impl BitXor<$T,$T> for $T {
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-05-12 20:14:40 -05:00
|
|
|
fn bitxor(&self, other: &$T) -> $T { *self ^ *other }
|
2013-04-18 05:58:58 -05:00
|
|
|
}
|
2013-04-23 12:56:49 -05:00
|
|
|
|
2013-05-08 06:11:23 -05:00
|
|
|
#[cfg(not(test))]
|
2013-05-12 20:14:40 -05:00
|
|
|
impl Shl<$T,$T> for $T {
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-05-12 20:14:40 -05:00
|
|
|
fn shl(&self, other: &$T) -> $T { *self << *other }
|
2013-04-18 05:58:58 -05:00
|
|
|
}
|
2013-04-23 12:56:49 -05:00
|
|
|
|
2013-05-08 06:11:23 -05:00
|
|
|
#[cfg(not(test))]
|
2013-05-12 20:14:40 -05:00
|
|
|
impl Shr<$T,$T> for $T {
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-05-12 20:14:40 -05:00
|
|
|
fn shr(&self, other: &$T) -> $T { *self >> *other }
|
2013-04-18 05:58:58 -05:00
|
|
|
}
|
2013-04-23 12:56:49 -05:00
|
|
|
|
2013-05-08 06:11:23 -05:00
|
|
|
#[cfg(not(test))]
|
2013-05-12 20:14:40 -05:00
|
|
|
impl Not<$T> for $T {
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-05-12 20:14:40 -05:00
|
|
|
fn not(&self) -> $T { !*self }
|
2013-04-18 05:58:58 -05:00
|
|
|
}
|
2013-02-12 19:07:26 -06:00
|
|
|
|
2013-05-12 20:14:40 -05:00
|
|
|
impl Bounded for $T {
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2014-01-25 01:37:51 -06:00
|
|
|
fn min_value() -> $T { MIN }
|
2013-04-25 19:02:00 -05:00
|
|
|
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2014-01-25 01:37:51 -06:00
|
|
|
fn max_value() -> $T { MAX }
|
2013-04-25 19:02:00 -05:00
|
|
|
}
|
|
|
|
|
2013-05-12 20:14:40 -05:00
|
|
|
impl Int for $T {}
|
2013-04-25 19:22:08 -05:00
|
|
|
|
2013-01-24 14:47:57 -06:00
|
|
|
// String conversion functions and impl str -> num
|
2012-08-02 19:14:26 -05:00
|
|
|
|
2013-01-24 14:47:57 -06:00
|
|
|
/// Parse a byte slice as a number in the given base.
|
2014-04-22 19:38:27 -05:00
|
|
|
///
|
|
|
|
/// Yields an `Option` because `buf` may or may not actually be parseable.
|
|
|
|
///
|
|
|
|
/// # Examples
|
2014-04-22 19:47:57 -05:00
|
|
|
///
|
2014-04-22 19:38:27 -05:00
|
|
|
/// ```rust
|
|
|
|
/// let digits = [49,50,51,52,53,54,55,56,57];
|
|
|
|
/// let base = 10;
|
|
|
|
/// let num = std::i64::parse_bytes(digits, base);
|
|
|
|
/// ```
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-05-12 20:14:40 -05:00
|
|
|
pub fn parse_bytes(buf: &[u8], radix: uint) -> Option<$T> {
|
2013-02-14 20:29:36 -06:00
|
|
|
strconv::from_str_bytes_common(buf, radix, false, false, false,
|
2013-04-07 09:23:42 -05:00
|
|
|
strconv::ExpNone, false, false)
|
2012-05-16 00:50:29 -05:00
|
|
|
}
|
|
|
|
|
2013-05-12 20:14:40 -05:00
|
|
|
impl FromStr for $T {
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-05-12 20:14:40 -05:00
|
|
|
fn from_str(s: &str) -> Option<$T> {
|
2013-09-15 00:27:32 -05:00
|
|
|
strconv::from_str_common(s, 10u, false, false, false,
|
|
|
|
strconv::ExpNone, false, false)
|
2012-06-04 20:05:34 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-05-12 20:14:40 -05:00
|
|
|
impl FromStrRadix for $T {
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-05-12 20:14:40 -05:00
|
|
|
fn from_str_radix(s: &str, radix: uint) -> Option<$T> {
|
2013-09-15 00:27:32 -05:00
|
|
|
strconv::from_str_common(s, radix, false, false, false,
|
|
|
|
strconv::ExpNone, false, false)
|
2012-05-16 00:50:29 -05:00
|
|
|
}
|
2013-01-24 14:47:57 -06:00
|
|
|
}
|
2012-06-04 16:20:57 -05:00
|
|
|
|
2013-01-24 14:47:57 -06:00
|
|
|
// String conversion functions and impl num -> str
|
2012-12-14 19:03:35 -06:00
|
|
|
|
2013-01-24 14:47:57 -06:00
|
|
|
/// Convert to a string as a byte slice in a given base.
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-11-18 23:15:42 -06:00
|
|
|
pub fn to_str_bytes<U>(n: $T, radix: uint, f: |v: &[u8]| -> U) -> U {
|
2013-06-28 16:05:10 -05:00
|
|
|
// The radix can be as low as 2, so we need at least 64 characters for a
|
|
|
|
// base 2 number.
|
|
|
|
let mut buf = [0u8, ..64];
|
|
|
|
let mut cur = 0;
|
2013-11-20 16:17:12 -06:00
|
|
|
strconv::int_to_str_bytes_common(n, radix, strconv::SignNone, |i| {
|
2013-06-28 16:05:10 -05:00
|
|
|
buf[cur] = i;
|
|
|
|
cur += 1;
|
2013-11-20 16:17:12 -06:00
|
|
|
});
|
2013-06-28 16:05:10 -05:00
|
|
|
f(buf.slice(0, cur))
|
2013-01-24 14:47:57 -06:00
|
|
|
}
|
2012-12-14 19:03:35 -06:00
|
|
|
|
2013-05-12 20:14:40 -05:00
|
|
|
impl ToStrRadix for $T {
|
2013-08-17 21:47:54 -05:00
|
|
|
/// Convert to a string in a given base.
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-03-21 23:20:48 -05:00
|
|
|
fn to_str_radix(&self, radix: uint) -> ~str {
|
2014-04-17 17:28:14 -05:00
|
|
|
let mut buf = Vec::new();
|
2013-11-20 16:17:12 -06:00
|
|
|
strconv::int_to_str_bytes_common(*self, radix, strconv::SignNone, |i| {
|
2013-08-17 21:47:54 -05:00
|
|
|
buf.push(i);
|
2013-11-20 16:17:12 -06:00
|
|
|
});
|
2013-08-17 21:47:54 -05:00
|
|
|
// We know we generated valid utf-8, so we don't need to go through that
|
|
|
|
// check.
|
2014-04-17 17:28:14 -05:00
|
|
|
unsafe { str::raw::from_utf8_owned(buf.move_iter().collect()) }
|
2013-01-24 14:47:57 -06:00
|
|
|
}
|
|
|
|
}
|
2012-05-16 00:50:29 -05:00
|
|
|
|
2014-01-17 15:53:00 -06:00
|
|
|
impl Primitive for $T {}
|
2013-05-12 20:14:40 -05:00
|
|
|
|
2014-01-14 18:32:04 -06:00
|
|
|
impl Bitwise for $T {
|
2014-02-16 17:12:10 -06:00
|
|
|
/// Returns the number of ones in the binary representation of the number.
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2014-02-16 17:12:10 -06:00
|
|
|
fn count_ones(&self) -> $T {
|
|
|
|
(*self as $T_SIGNED).count_ones() as $T
|
2013-05-12 20:14:40 -05:00
|
|
|
}
|
|
|
|
|
2014-02-16 17:12:10 -06:00
|
|
|
/// Returns the number of leading zeros in the in the binary representation
|
|
|
|
/// of the number.
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-05-12 20:14:40 -05:00
|
|
|
fn leading_zeros(&self) -> $T {
|
|
|
|
(*self as $T_SIGNED).leading_zeros() as $T
|
|
|
|
}
|
|
|
|
|
2014-02-16 17:12:10 -06:00
|
|
|
/// Returns the number of trailing zeros in the in the binary representation
|
|
|
|
/// of the number.
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-05-12 20:14:40 -05:00
|
|
|
fn trailing_zeros(&self) -> $T {
|
|
|
|
(*self as $T_SIGNED).trailing_zeros() as $T
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-04-15 10:08:52 -05:00
|
|
|
#[cfg(test)]
|
|
|
|
mod tests {
|
|
|
|
use prelude::*;
|
2013-09-08 14:00:00 -05:00
|
|
|
use super::*;
|
2013-04-18 05:58:58 -05:00
|
|
|
|
2013-05-24 21:35:29 -05:00
|
|
|
use num;
|
2014-01-06 21:05:53 -06:00
|
|
|
use num::CheckedDiv;
|
2014-01-14 18:32:04 -06:00
|
|
|
use num::Bitwise;
|
2014-02-22 19:41:43 -06:00
|
|
|
use num::ToStrRadix;
|
2014-04-15 20:17:48 -05:00
|
|
|
use str::StrSlice;
|
2013-05-24 21:35:29 -05:00
|
|
|
use u16;
|
|
|
|
|
2014-01-30 06:55:34 -06:00
|
|
|
#[test]
|
|
|
|
fn test_overflows() {
|
|
|
|
assert!(MAX > 0);
|
|
|
|
assert!(MIN <= 0);
|
|
|
|
assert_eq!(MIN + MAX + 1, 0);
|
|
|
|
}
|
|
|
|
|
2013-04-24 05:08:08 -05:00
|
|
|
#[test]
|
|
|
|
fn test_num() {
|
2013-05-12 20:14:40 -05:00
|
|
|
num::test_num(10 as $T, 2 as $T);
|
2013-04-24 05:08:08 -05:00
|
|
|
}
|
|
|
|
|
2013-04-18 05:58:58 -05:00
|
|
|
#[test]
|
2013-04-26 01:27:51 -05:00
|
|
|
fn test_bitwise() {
|
2013-05-12 20:14:40 -05:00
|
|
|
assert_eq!(0b1110 as $T, (0b1100 as $T).bitor(&(0b1010 as $T)));
|
|
|
|
assert_eq!(0b1000 as $T, (0b1100 as $T).bitand(&(0b1010 as $T)));
|
|
|
|
assert_eq!(0b0110 as $T, (0b1100 as $T).bitxor(&(0b1010 as $T)));
|
|
|
|
assert_eq!(0b1110 as $T, (0b0111 as $T).shl(&(1 as $T)));
|
|
|
|
assert_eq!(0b0111 as $T, (0b1110 as $T).shr(&(1 as $T)));
|
2014-01-25 01:37:51 -06:00
|
|
|
assert_eq!(MAX - (0b1011 as $T), (0b1011 as $T).not());
|
2013-04-18 05:58:58 -05:00
|
|
|
}
|
|
|
|
|
2013-04-26 01:27:51 -05:00
|
|
|
#[test]
|
2014-02-16 17:12:10 -06:00
|
|
|
fn test_count_ones() {
|
|
|
|
assert_eq!((0b0101100 as $T).count_ones(), 3);
|
|
|
|
assert_eq!((0b0100001 as $T).count_ones(), 2);
|
|
|
|
assert_eq!((0b1111001 as $T).count_ones(), 5);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_count_zeros() {
|
|
|
|
assert_eq!((0b0101100 as $T).count_zeros(), BITS as $T - 3);
|
|
|
|
assert_eq!((0b0100001 as $T).count_zeros(), BITS as $T - 2);
|
|
|
|
assert_eq!((0b1111001 as $T).count_zeros(), BITS as $T - 5);
|
2013-04-26 01:27:51 -05:00
|
|
|
}
|
|
|
|
|
2013-04-15 10:08:52 -05:00
|
|
|
#[test]
|
|
|
|
pub fn test_to_str() {
|
2014-04-15 20:17:48 -05:00
|
|
|
assert_eq!((0 as $T).to_str_radix(10u), "0".to_owned());
|
|
|
|
assert_eq!((1 as $T).to_str_radix(10u), "1".to_owned());
|
|
|
|
assert_eq!((2 as $T).to_str_radix(10u), "2".to_owned());
|
|
|
|
assert_eq!((11 as $T).to_str_radix(10u), "11".to_owned());
|
|
|
|
assert_eq!((11 as $T).to_str_radix(16u), "b".to_owned());
|
|
|
|
assert_eq!((255 as $T).to_str_radix(16u), "ff".to_owned());
|
|
|
|
assert_eq!((0xff as $T).to_str_radix(10u), "255".to_owned());
|
2013-04-15 10:08:52 -05:00
|
|
|
}
|
2012-06-04 20:05:34 -05:00
|
|
|
|
2013-04-15 10:08:52 -05:00
|
|
|
#[test]
|
|
|
|
pub fn test_from_str() {
|
2013-09-15 00:27:32 -05:00
|
|
|
assert_eq!(from_str::<$T>("0"), Some(0u as $T));
|
|
|
|
assert_eq!(from_str::<$T>("3"), Some(3u as $T));
|
|
|
|
assert_eq!(from_str::<$T>("10"), Some(10u as $T));
|
|
|
|
assert_eq!(from_str::<u32>("123456789"), Some(123456789 as u32));
|
|
|
|
assert_eq!(from_str::<$T>("00100"), Some(100u as $T));
|
2013-05-23 11:39:17 -05:00
|
|
|
|
2013-09-15 00:27:32 -05:00
|
|
|
assert!(from_str::<$T>("").is_none());
|
|
|
|
assert!(from_str::<$T>(" ").is_none());
|
|
|
|
assert!(from_str::<$T>("x").is_none());
|
2013-04-15 10:08:52 -05:00
|
|
|
}
|
2012-05-16 00:50:29 -05:00
|
|
|
|
2013-04-15 10:08:52 -05:00
|
|
|
#[test]
|
|
|
|
pub fn test_parse_bytes() {
|
2013-06-10 22:10:37 -05:00
|
|
|
use str::StrSlice;
|
|
|
|
assert_eq!(parse_bytes("123".as_bytes(), 10u), Some(123u as $T));
|
|
|
|
assert_eq!(parse_bytes("1001".as_bytes(), 2u), Some(9u as $T));
|
|
|
|
assert_eq!(parse_bytes("123".as_bytes(), 8u), Some(83u as $T));
|
|
|
|
assert_eq!(u16::parse_bytes("123".as_bytes(), 16u), Some(291u as u16));
|
|
|
|
assert_eq!(u16::parse_bytes("ffff".as_bytes(), 16u), Some(65535u as u16));
|
|
|
|
assert_eq!(parse_bytes("z".as_bytes(), 36u), Some(35u as $T));
|
|
|
|
|
|
|
|
assert!(parse_bytes("Z".as_bytes(), 10u).is_none());
|
|
|
|
assert!(parse_bytes("_".as_bytes(), 2u).is_none());
|
2013-04-15 10:08:52 -05:00
|
|
|
}
|
2012-06-04 17:22:40 -05:00
|
|
|
|
2013-04-15 10:08:52 -05:00
|
|
|
#[test]
|
|
|
|
fn test_uint_to_str_overflow() {
|
|
|
|
let mut u8_val: u8 = 255_u8;
|
2014-04-15 20:17:48 -05:00
|
|
|
assert_eq!(u8_val.to_str(), "255".to_owned());
|
2013-01-24 14:47:57 -06:00
|
|
|
|
2013-04-15 10:08:52 -05:00
|
|
|
u8_val += 1 as u8;
|
2014-04-15 20:17:48 -05:00
|
|
|
assert_eq!(u8_val.to_str(), "0".to_owned());
|
2013-01-24 14:47:57 -06:00
|
|
|
|
2013-04-15 10:08:52 -05:00
|
|
|
let mut u16_val: u16 = 65_535_u16;
|
2014-04-15 20:17:48 -05:00
|
|
|
assert_eq!(u16_val.to_str(), "65535".to_owned());
|
2013-01-24 14:47:57 -06:00
|
|
|
|
2013-04-15 10:08:52 -05:00
|
|
|
u16_val += 1 as u16;
|
2014-04-15 20:17:48 -05:00
|
|
|
assert_eq!(u16_val.to_str(), "0".to_owned());
|
2013-01-24 14:47:57 -06:00
|
|
|
|
2013-04-15 10:08:52 -05:00
|
|
|
let mut u32_val: u32 = 4_294_967_295_u32;
|
2014-04-15 20:17:48 -05:00
|
|
|
assert_eq!(u32_val.to_str(), "4294967295".to_owned());
|
2013-01-24 14:47:57 -06:00
|
|
|
|
2013-04-15 10:08:52 -05:00
|
|
|
u32_val += 1 as u32;
|
2014-04-15 20:17:48 -05:00
|
|
|
assert_eq!(u32_val.to_str(), "0".to_owned());
|
2013-01-24 14:47:57 -06:00
|
|
|
|
2013-04-15 10:08:52 -05:00
|
|
|
let mut u64_val: u64 = 18_446_744_073_709_551_615_u64;
|
2014-04-15 20:17:48 -05:00
|
|
|
assert_eq!(u64_val.to_str(), "18446744073709551615".to_owned());
|
2013-01-24 14:47:57 -06:00
|
|
|
|
2013-04-15 10:08:52 -05:00
|
|
|
u64_val += 1 as u64;
|
2014-04-15 20:17:48 -05:00
|
|
|
assert_eq!(u64_val.to_str(), "0".to_owned());
|
2013-04-15 10:08:52 -05:00
|
|
|
}
|
2013-01-24 14:47:57 -06:00
|
|
|
|
2013-04-15 10:08:52 -05:00
|
|
|
#[test]
|
|
|
|
fn test_uint_from_str_overflow() {
|
|
|
|
let mut u8_val: u8 = 255_u8;
|
2013-09-15 00:27:32 -05:00
|
|
|
assert_eq!(from_str::<u8>("255"), Some(u8_val));
|
|
|
|
assert!(from_str::<u8>("256").is_none());
|
2013-01-24 14:47:57 -06:00
|
|
|
|
2013-04-15 10:08:52 -05:00
|
|
|
u8_val += 1 as u8;
|
2013-09-15 00:27:32 -05:00
|
|
|
assert_eq!(from_str::<u8>("0"), Some(u8_val));
|
|
|
|
assert!(from_str::<u8>("-1").is_none());
|
2013-01-24 14:47:57 -06:00
|
|
|
|
2013-04-15 10:08:52 -05:00
|
|
|
let mut u16_val: u16 = 65_535_u16;
|
2013-09-15 00:27:32 -05:00
|
|
|
assert_eq!(from_str::<u16>("65535"), Some(u16_val));
|
|
|
|
assert!(from_str::<u16>("65536").is_none());
|
2013-01-24 14:47:57 -06:00
|
|
|
|
2013-04-15 10:08:52 -05:00
|
|
|
u16_val += 1 as u16;
|
2013-09-15 00:27:32 -05:00
|
|
|
assert_eq!(from_str::<u16>("0"), Some(u16_val));
|
|
|
|
assert!(from_str::<u16>("-1").is_none());
|
2013-01-24 14:47:57 -06:00
|
|
|
|
2013-04-15 10:08:52 -05:00
|
|
|
let mut u32_val: u32 = 4_294_967_295_u32;
|
2013-09-15 00:27:32 -05:00
|
|
|
assert_eq!(from_str::<u32>("4294967295"), Some(u32_val));
|
|
|
|
assert!(from_str::<u32>("4294967296").is_none());
|
2013-01-24 14:47:57 -06:00
|
|
|
|
2013-04-15 10:08:52 -05:00
|
|
|
u32_val += 1 as u32;
|
2013-09-15 00:27:32 -05:00
|
|
|
assert_eq!(from_str::<u32>("0"), Some(u32_val));
|
|
|
|
assert!(from_str::<u32>("-1").is_none());
|
2013-01-24 14:47:57 -06:00
|
|
|
|
2013-04-15 10:08:52 -05:00
|
|
|
let mut u64_val: u64 = 18_446_744_073_709_551_615_u64;
|
2013-09-15 00:27:32 -05:00
|
|
|
assert_eq!(from_str::<u64>("18446744073709551615"), Some(u64_val));
|
|
|
|
assert!(from_str::<u64>("18446744073709551616").is_none());
|
2013-01-24 14:47:57 -06:00
|
|
|
|
2013-04-15 10:08:52 -05:00
|
|
|
u64_val += 1 as u64;
|
2013-09-15 00:27:32 -05:00
|
|
|
assert_eq!(from_str::<u64>("0"), Some(u64_val));
|
|
|
|
assert!(from_str::<u64>("-1").is_none());
|
2013-04-15 10:08:52 -05:00
|
|
|
}
|
2013-01-24 14:47:57 -06:00
|
|
|
|
2013-04-15 10:08:52 -05:00
|
|
|
#[test]
|
|
|
|
#[should_fail]
|
|
|
|
pub fn to_str_radix1() {
|
2013-08-17 21:47:54 -05:00
|
|
|
100u.to_str_radix(1u);
|
2013-04-15 10:08:52 -05:00
|
|
|
}
|
2012-06-04 17:22:40 -05:00
|
|
|
|
2013-04-15 10:08:52 -05:00
|
|
|
#[test]
|
|
|
|
#[should_fail]
|
|
|
|
pub fn to_str_radix37() {
|
2013-08-17 21:47:54 -05:00
|
|
|
100u.to_str_radix(37u);
|
2013-04-15 10:08:52 -05:00
|
|
|
}
|
A new `times` method on numeric types
This method is intended to elegantly subsume two common iteration functions.
The first is `iter::range`, which is used identically to the method introduced
in this commit, but currently works only on uints. The second is a common case
of `{int, i8, uint, etc.}::range`, in the case where the inductive variable is
ignored. Compare the usage of the three:
```
for iter::range(100u) {
// do whatever
}
for int::range(0, 100) |_i| {
// do whatever
}
for 100.times {
// do whatever
}
```
I feel that the latter reads much more nicely than the first two approaches,
and unlike the first two the new method allows the user to ignore the specific
type of the number (ineed, if we're throwing away the inductive variable, who
cares what type it is?). A minor benefit is that this new method will be
somewhat familiar to users of Ruby, from which we borrow the name "times".
2012-07-05 21:12:26 -05:00
|
|
|
|
2013-08-11 17:32:07 -05:00
|
|
|
#[test]
|
|
|
|
fn test_unsigned_checked_div() {
|
|
|
|
assert_eq!(10u.checked_div(&2), Some(5));
|
|
|
|
assert_eq!(5u.checked_div(&0), None);
|
|
|
|
}
|
2013-04-18 17:53:29 -05:00
|
|
|
}
|
2013-05-12 20:14:40 -05:00
|
|
|
|
2013-11-29 13:30:31 -06:00
|
|
|
))
|