mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-26 22:05:14 +00:00
auto merge of #8459 : thestinger/rust/checked, r=graydon
This commit is contained in:
commit
4bdceb9c00
@ -17,7 +17,7 @@ macro_rules! int_module (($T:ty, $bits:expr) => (mod generated {
|
|||||||
#[allow(non_uppercase_statics)];
|
#[allow(non_uppercase_statics)];
|
||||||
|
|
||||||
use num::{ToStrRadix, FromStrRadix};
|
use num::{ToStrRadix, FromStrRadix};
|
||||||
use num::{Zero, One, strconv};
|
use num::{CheckedDiv, Zero, One, strconv};
|
||||||
use prelude::*;
|
use prelude::*;
|
||||||
use str;
|
use str;
|
||||||
|
|
||||||
@ -29,6 +29,17 @@ pub static bytes : uint = ($bits / 8);
|
|||||||
pub static min_value: $T = (-1 as $T) << (bits - 1);
|
pub static min_value: $T = (-1 as $T) << (bits - 1);
|
||||||
pub static max_value: $T = min_value - 1 as $T;
|
pub static max_value: $T = min_value - 1 as $T;
|
||||||
|
|
||||||
|
impl CheckedDiv for $T {
|
||||||
|
#[inline]
|
||||||
|
fn checked_div(&self, v: &$T) -> Option<$T> {
|
||||||
|
if *v == 0 || (*self == min_value && *v == -1) {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(self / *v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
enum Range { Closed, HalfOpen }
|
enum Range { Closed, HalfOpen }
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
@ -551,6 +562,7 @@ mod tests {
|
|||||||
use super::*;
|
use super::*;
|
||||||
use prelude::*;
|
use prelude::*;
|
||||||
|
|
||||||
|
use int;
|
||||||
use i16;
|
use i16;
|
||||||
use i32;
|
use i32;
|
||||||
use i64;
|
use i64;
|
||||||
@ -921,6 +933,13 @@ mod tests {
|
|||||||
fn test_range_step_zero_step() {
|
fn test_range_step_zero_step() {
|
||||||
do range_step(0,10,0) |_i| { true };
|
do range_step(0,10,0) |_i| { true };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_signed_checked_div() {
|
||||||
|
assert_eq!(10i.checked_div(&2), Some(5));
|
||||||
|
assert_eq!(5i.checked_div(&0), None);
|
||||||
|
assert_eq!(int::min_value.checked_div(&-1), None);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}))
|
}))
|
||||||
|
@ -892,6 +892,10 @@ impl CheckedMul for uint {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub trait CheckedDiv: Div<Self, Self> {
|
||||||
|
fn checked_div(&self, v: &Self) -> Option<Self>;
|
||||||
|
}
|
||||||
|
|
||||||
/// Helper function for testing numeric operations
|
/// Helper function for testing numeric operations
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
pub fn test_num<T:Num + NumCast>(ten: T, two: T) {
|
pub fn test_num<T:Num + NumCast>(ten: T, two: T) {
|
||||||
|
@ -18,7 +18,7 @@ macro_rules! uint_module (($T:ty, $T_SIGNED:ty, $bits:expr) => (mod generated {
|
|||||||
|
|
||||||
use num::BitCount;
|
use num::BitCount;
|
||||||
use num::{ToStrRadix, FromStrRadix};
|
use num::{ToStrRadix, FromStrRadix};
|
||||||
use num::{Zero, One, strconv};
|
use num::{CheckedDiv, Zero, One, strconv};
|
||||||
use prelude::*;
|
use prelude::*;
|
||||||
use str;
|
use str;
|
||||||
|
|
||||||
@ -30,6 +30,17 @@ pub static bytes : uint = ($bits / 8);
|
|||||||
pub static min_value: $T = 0 as $T;
|
pub static min_value: $T = 0 as $T;
|
||||||
pub static max_value: $T = 0 as $T - 1 as $T;
|
pub static max_value: $T = 0 as $T - 1 as $T;
|
||||||
|
|
||||||
|
impl CheckedDiv for $T {
|
||||||
|
#[inline]
|
||||||
|
fn checked_div(&self, v: &$T) -> Option<$T> {
|
||||||
|
if *v == 0 {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(self / *v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
enum Range { Closed, HalfOpen }
|
enum Range { Closed, HalfOpen }
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
@ -694,6 +705,12 @@ mod tests {
|
|||||||
fn test_range_step_zero_step_down() {
|
fn test_range_step_zero_step_down() {
|
||||||
do range_step(0,-10,0) |_i| { true };
|
do range_step(0,-10,0) |_i| { true };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_unsigned_checked_div() {
|
||||||
|
assert_eq!(10u.checked_div(&2), Some(5));
|
||||||
|
assert_eq!(5u.checked_div(&0), None);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}))
|
}))
|
||||||
|
Loading…
Reference in New Issue
Block a user