mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-30 03:57:37 +00:00
66 lines
1.9 KiB
Rust
66 lines
1.9 KiB
Rust
![]() |
// 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
|
||
|
}
|