| // This would belong to `rustc_data_structures`, but `rustc_serialize` needs it too. |
| |
| /// Addition, but only overflow checked when `cfg(debug_assertions)` is set |
| /// instead of respecting `-Coverflow-checks`. |
| /// |
| /// This exists for performance reasons, as we ship rustc with overflow checks. |
| /// While overflow checks are perf neutral in almost all of the compiler, there |
| /// are a few particularly hot areas where we don't want overflow checks in our |
| /// dist builds. Overflow is still a bug there, so we want overflow check for |
| /// builds with debug assertions. |
| /// |
| /// That's a long way to say that this should be used in areas where overflow |
| /// is a bug but overflow checking is too slow. |
| pub trait DebugStrictAdd { |
| /// See [`DebugStrictAdd`]. |
| fn debug_strict_add(self, other: Self) -> Self; |
| } |
| |
| macro_rules! impl_debug_strict_add { |
| ($( $ty:ty )*) => { |
| $( |
| impl DebugStrictAdd for $ty { |
| fn debug_strict_add(self, other: Self) -> Self { |
| if cfg!(debug_assertions) { |
| self + other |
| } else { |
| self.wrapping_add(other) |
| } |
| } |
| } |
| )* |
| }; |
| } |
| |
| /// See [`DebugStrictAdd`]. |
| pub trait DebugStrictSub { |
| /// See [`DebugStrictAdd`]. |
| fn debug_strict_sub(self, other: Self) -> Self; |
| } |
| |
| macro_rules! impl_debug_strict_sub { |
| ($( $ty:ty )*) => { |
| $( |
| impl DebugStrictSub for $ty { |
| fn debug_strict_sub(self, other: Self) -> Self { |
| if cfg!(debug_assertions) { |
| self - other |
| } else { |
| self.wrapping_sub(other) |
| } |
| } |
| } |
| )* |
| }; |
| } |
| |
| impl_debug_strict_add! { |
| u8 u16 u32 u64 u128 usize |
| i8 i16 i32 i64 i128 isize |
| } |
| |
| impl_debug_strict_sub! { |
| u8 u16 u32 u64 u128 usize |
| i8 i16 i32 i64 i128 isize |
| } |