blob: e0c9814e045f8542851c804f8f663db31b88af37 [file] [log] [blame]
use core::mem;
use core::slice;
/// Trigger an assertion if "cond" fails in debug builds, return an error in
/// release builds.
macro_rules! dcheck {
($cond:expr, $err:expr) => {
let cond = $cond;
debug_assert!(cond);
if !(cond) {
return Err($err);
}
};
}
pub(crate) use dcheck;
/// Assert that a Result is_ok(). Why is this not in the standard library?
#[cfg(test)]
macro_rules! assert_ok {
($cond:expr) => {
let result = $cond;
assert!(result.is_ok());
};
}
#[cfg(test)]
pub(crate) use assert_ok;
/// Assert that a Result is_err(). Why is this not in the standard library?
#[cfg(test)]
macro_rules! assert_err {
($cond:expr) => {
let result = $cond;
assert!(result.is_err());
};
}
#[cfg(test)]
pub(crate) use assert_err;
// FIXME these are quick and dirty hacks to make serialization of POD types
// easier
pub fn as_unsafe_blob<T: Sized>(p: &T) -> &[u8] {
unsafe {
let tp: *const T = p as *const T;
let pp: *const u8 = tp as *const u8;
slice::from_raw_parts(pp, mem::size_of::<T>())
}
}
pub fn as_unsafe_blob_mut<T: Sized>(p: &mut T) -> &mut [u8] {
unsafe {
let tp: *mut T = p as *mut T;
let pp: *mut u8 = tp as *mut u8;
slice::from_raw_parts_mut(pp, mem::size_of::<T>())
}
}
pub fn from_unsafe_blob<T: Sized>(p: &[u8]) -> &T {
unsafe {
let pp: *const u8 = p.as_ptr();
let tp: *const T = pp as *const T;
return &*tp;
}
}
pub fn from_unsafe_blob_mut<T: Sized>(p: &mut [u8]) -> &mut T {
unsafe {
let pp: *mut u8 = p.as_mut_ptr();
let tp: *mut T = pp as *mut T;
return &mut *tp;
}
}
pub fn slice_as_unsafe_blob_mut<T: Sized>(p: &mut [T]) -> &mut [u8] {
unsafe {
let tp: *mut T = p.as_mut_ptr();
let pp: *mut u8 = tp as *mut u8;
slice::from_raw_parts_mut(pp, mem::size_of::<T>())
}
}
pub fn slice_as_unsafe_blob<T: Sized>(p: &[T]) -> &[u8] {
unsafe {
let tp: *const T = p.as_ptr();
let pp: *const u8 = tp as *const u8;
slice::from_raw_parts(pp, mem::size_of::<T>())
}
}