Skip to content

Commit 5c0d192

Browse files
committed
auto merge of #8515 : kballard/rust/saturating-checked, r=thestinger
r? @thestinger
2 parents fc3297f + 15159a5 commit 5c0d192

File tree

1 file changed

+25
-38
lines changed

1 file changed

+25
-38
lines changed

src/libstd/num/num.rs

+25-38
Original file line numberDiff line numberDiff line change
@@ -468,55 +468,42 @@ impl<T: Zero> Zero for ~T {
468468
}
469469

470470
/// Saturating math operations
471-
pub trait Saturating: Int {
471+
pub trait Saturating {
472472
/// Saturating addition operator.
473473
/// Returns a+b, saturating at the numeric bounds instead of overflowing.
474+
fn saturating_add(self, v: Self) -> Self;
475+
476+
/// Saturating subtraction operator.
477+
/// Returns a-b, saturating at the numeric bounds instead of overflowing.
478+
fn saturating_sub(self, v: Self) -> Self;
479+
}
480+
481+
impl<T: CheckedAdd+CheckedSub+Zero+Ord+Bounded> Saturating for T {
474482
#[inline]
475-
fn saturating_add(self, v: Self) -> Self {
476-
let x = self + v;
477-
if v >= Zero::zero() {
478-
if x < self {
479-
// overflow
480-
Bounded::max_value::<Self>()
481-
} else { x }
482-
} else {
483-
if x > self {
484-
// underflow
485-
Bounded::min_value::<Self>()
486-
} else { x }
483+
fn saturating_add(self, v: T) -> T {
484+
match self.checked_add(&v) {
485+
Some(x) => x,
486+
None => if v >= Zero::zero() {
487+
Bounded::max_value::<T>()
488+
} else {
489+
Bounded::min_value::<T>()
490+
}
487491
}
488492
}
489493

490-
/// Saturating subtraction operator.
491-
/// Returns a-b, saturating at the numeric bounds instead of overflowing.
492494
#[inline]
493-
fn saturating_sub(self, v: Self) -> Self {
494-
let x = self - v;
495-
if v >= Zero::zero() {
496-
if x > self {
497-
// underflow
498-
Bounded::min_value::<Self>()
499-
} else { x }
500-
} else {
501-
if x < self {
502-
// overflow
503-
Bounded::max_value::<Self>()
504-
} else { x }
495+
fn saturating_sub(self, v: T) -> T {
496+
match self.checked_sub(&v) {
497+
Some(x) => x,
498+
None => if v >= Zero::zero() {
499+
Bounded::min_value::<T>()
500+
} else {
501+
Bounded::max_value::<T>()
502+
}
505503
}
506504
}
507505
}
508506

509-
impl Saturating for int {}
510-
impl Saturating for i8 {}
511-
impl Saturating for i16 {}
512-
impl Saturating for i32 {}
513-
impl Saturating for i64 {}
514-
impl Saturating for uint {}
515-
impl Saturating for u8 {}
516-
impl Saturating for u16 {}
517-
impl Saturating for u32 {}
518-
impl Saturating for u64 {}
519-
520507
pub trait CheckedAdd: Add<Self, Self> {
521508
fn checked_add(&self, v: &Self) -> Option<Self>;
522509
}

0 commit comments

Comments
 (0)