aboutsummaryrefslogtreecommitdiff
path: root/src/safer_unchecked.rs
diff options
context:
space:
mode:
authoriximeow <me@iximeow.net>2024-06-22 11:03:43 -0700
committeriximeow <me@iximeow.net>2024-06-22 11:03:59 -0700
commita66be66c22bc31526ac35c1cffdb28992a392ccf (patch)
tree6f49a2e49114256121d3239c2d7223cf635d3c9e /src/safer_unchecked.rs
parentc21a5f2956d8e0fa3eace14661a8aed124c6e995 (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.rs30
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()
+ }
+}