diff options
author | iximeow <me@iximeow.net> | 2024-06-22 11:03:43 -0700 |
---|---|---|
committer | iximeow <me@iximeow.net> | 2024-06-22 11:03:59 -0700 |
commit | a66be66c22bc31526ac35c1cffdb28992a392ccf (patch) | |
tree | 6f49a2e49114256121d3239c2d7223cf635d3c9e /src/safer_unchecked.rs | |
parent | c21a5f2956d8e0fa3eace14661a8aed124c6e995 (diff) |
move DisplaySink code out from yaxpeax-x86
it was built in-place around yaxpeax-x86, hoisted out once it seemed
suitable and could be generalized. yay!
also include a Makefile in yaxpeax-arch now to test that various crate
feature flag combinations.. work.
Diffstat (limited to 'src/safer_unchecked.rs')
-rw-r--r-- | src/safer_unchecked.rs | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/safer_unchecked.rs b/src/safer_unchecked.rs new file mode 100644 index 0000000..34216bc --- /dev/null +++ b/src/safer_unchecked.rs @@ -0,0 +1,30 @@ +use core::slice::SliceIndex; + +pub trait GetSaferUnchecked<T> { + unsafe fn get_kinda_unchecked<I>(&self, index: I) -> &<I as SliceIndex<[T]>>::Output + where + I: SliceIndex<[T]>; +} + +impl<T> GetSaferUnchecked<T> for [T] { + #[inline(always)] + unsafe fn get_kinda_unchecked<I>(&self, index: I) -> &<I as SliceIndex<[T]>>::Output + where + I: SliceIndex<[T]>, + { + if cfg!(debug_assertions) { + &self[index] + } else { + self.get_unchecked(index) + } + } +} + +#[inline(always)] +pub unsafe fn unreachable_kinda_unchecked() -> ! { + if cfg!(debug_assertions) { + panic!("UB: Unreachable unchecked was executed") + } else { + core::hint::unreachable_unchecked() + } +} |