// Copyright 2022 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

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