3 个版本
0.1.2 | 2022年1月2日 |
---|---|
0.1.1 | 2022年1月2日 |
0.1.0 | 2022年1月2日 |
#421 在 调试 中
253,597 每月下载次数
用于 12 个 Crates (2 个直接使用)
17KB
179 行
assert-unchecked
在发布模式下允许优化的不安全断言。
这些宏使用 core::hint::unreachable_unchecked
,这使得可以编写既明确代码又向 LLVM 提供优化提示的断言。
使用方法
将此添加到您的 Cargo.toml
[dependencies]
assert_unchecked = "0.1.2"
示例
use assert_unchecked::{
assert_eq_unchecked, assert_ne_unchecked, assert_unchecked, unreachable_unchecked,
};
fn copy(from_arr: &[u8], to_arr: &mut [u8]) {
assert_eq!(from_arr.len(), to_arr.len());
for i in 0..to_arr.len() {
// SAFETY: bounds of to_arr is checked outside of loop
// Without this line, the compiler isn't smart enough to remove the bounds check
unsafe { assert_unchecked!(i <= to_arr.len()) };
to_arr[i] = from_arr[i];
}
}
fn get_last(len: usize) -> usize {
if len == 0 {
return 0;
}
let mut v = vec![0];
for i in 1..len {
v.push(i)
}
// SAFETY: `len` elements have been added to v at this point
// Without this line, the compiler isn't smart enough to remove the bounds check
unsafe { assert_eq_unchecked!(len, v.len()) };
v[len - 1]
}
// Modifies `a[0]` and `a[delta]`, and then returns `a[0]`.
// delta must be non-zero and delta < a.len().
unsafe fn modify_start_and_delta(a: &mut [u8], delta: usize) -> u8 {
// SAFETY: requirements are invariants of the unsafe function.
assert_unchecked!(delta < a.len());
// With this assertion, we know that a[delta] does not modify a[0],
// which means the function can optimize the return value to always be 0.
// This also means that all bounds checks can be removed.
assert_ne_unchecked!(delta, 0);
a[0] = 0;
a[delta] = 1;
a[0]
}
fn div_1(a: u32, b: u32) -> u32 {
// `b.saturating_add(1)` is always positive (not zero),
// hence `checked_div` will never return `None`.
// Therefore, the else branch is unreachable.
a.checked_div(b.saturating_add(1))
.unwrap_or_else(|| unsafe { unreachable_unchecked!("division by zero isn't possible") })
}