3 releases
0.1.2 | Jul 11, 2024 |
---|---|
0.1.1 | Jul 11, 2024 |
0.1.0 | Jul 11, 2024 |
#810 in Rust patterns
27 downloads per month
Used in 2 crates
(via rb64)
5KB
Debug Unreachable
This crate defines an unreachable! macro that is conditionally compiled depending on the build profile. If the build is debug , it translates to core::unreachable If the build is release, it translates to core::hint::unreachable_unchecked There are cases where unreachable_unchecked is faster that unreachable. This macro uses the unchecked version on release mode, but still checks on debug mode, allowing you to catch cases in which the unreachable code is reached.
lib.rs
:
This crate defines an [unreachable!] macro that is conditionally compiled depending on the build profile.
If the build is debug , it translates to core::unreachable
If the build is release, it translates to core::hint::unreachable_unchecked
There are cases where unreachable_unchecked is faster that unreachable. This macro uses the unchecked version on release mode, but still checks on debug mode, allowing you to catch cases in which the unreachable code is reached.
Example
use dbg_unreachable::unreachable;
let a = Some(12_i32);
match a {
Some(n) if n >= 0 => {},
Some(n) if n < 0 => {},
Some(_) => unreachable!("The two arms above cover all possible cases"),
None => {},
}
The piece of code above translates to this two pieces.
Debug
use dbg_unreachable::unreachable;
let a = Some(12_i32);
match a {
Some(n) if n >= 0 => {},
Some(n) if n < 0 => {},
Some(_) => core::unreachable!("The two arms above cover all possible cases"),
None => {},
}
Release
use dbg_unreachable::unreachable;
let a = Some(12_i32);
match a {
Some(n) if n >= 0 => {},
Some(n) if n < 0 => {},
Some(_) => unsafe { core::hint::unreachable_unchecked() },
None => {},
}