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>())
    }
}
