#[macro_export]
macro_rules! unchecked {
($unsafe_:expr, $safe:expr) => {{
#[cfg(not(reduce_unsafe))]
macro_rules! __reduce_unsafe_internal {
() => { $unsafe_ }
}
#[cfg(reduce_unsafe)]
macro_rules! __reduce_unsafe_internal {
() => { $safe }
}
__reduce_unsafe_internal!()
}}
}
#[macro_export]
macro_rules! checked {
($unsafe_:expr, $safe:expr) => {{
#[cfg(not(debug_assertions))]
macro_rules! __reduce_unsafe_internal {
() => {
$crate::unchecked!($unsafe_, $safe)
}
}
#[cfg(debug_assertions)]
macro_rules! __reduce_unsafe_internal {
() => {{
let unsafe_ = $unsafe_;
let safe = $safe;
debug_assert_eq!(unsafe_, safe);
unsafe_
}}
}
__reduce_unsafe_internal!()
}}
}
#[test]
#[cfg_attr(reduce_unsafe, should_panic)]
fn unchecked() {
let b = b"hello world\xff";
let s = unchecked!(
unsafe { core::str::from_utf8_unchecked(b) },
core::str::from_utf8(b).expect("BUG: unsound unsafe code detected")
);
assert_eq!(s.len(), 12);
}
#[test]
#[should_panic]
fn checked() {
let b = b"hello world\xff";
let _ = checked!(
unsafe { core::str::from_utf8_unchecked(b) },
core::str::from_utf8(b).expect("BUG: unsound unsafe code detected")
);
unreachable!();
}