#![cfg_attr(feature = "no-std", no_std)]
#![warn(missing_docs)]
#[cfg(not(feature = "no-std"))]
pub mod internal;
pub mod memory;
#[cfg(feature = "external")]
pub mod module;
#[cfg(feature = "external")]
pub mod process;
#[cfg(feature = "external")]
pub mod thread;
#[cfg(any(not(feature = "no-std"), feature = "alloc"))]
pub mod pattern;
pub mod types;
mod error;
pub use error::*;
mod macros;
pub use macros::*;
#[inline(always)]
pub unsafe fn to_ref<'a, T>(ptr: *const T) -> &'a T {
&*ptr
}
#[inline(always)]
pub unsafe fn to_mut_ref<'a, T>(ptr: *const T) -> &'a mut T {
&mut *(ptr as *mut T)
}
#[inline]
pub unsafe fn terminated_array<T: PartialEq>(mut ptr: *const T, last: &T) -> &[T] {
let mut len = 0;
while &*ptr != last {
ptr = ptr.add(1);
len += 1;
}
core::slice::from_raw_parts(ptr.sub(len), len)
}
#[inline]
pub unsafe fn terminated_array_mut<T: PartialEq>(mut ptr: *mut T, last: &T) -> &mut [T] {
let mut len = 0;
while &*ptr != last || len >= usize::MAX {
ptr = ptr.add(1);
len += 1;
}
core::slice::from_raw_parts_mut(ptr.sub(len), len)
}
pub use memoffset::offset_of;
pub use obfstr::wide;