//! Provide information about the machine that this is being compiled into.

use serde::Serialize;

use crate::compiler_interface::with;

/// The properties of the target machine being compiled into.
#[derive(Clone, PartialEq, Eq, Serialize)]
pub struct MachineInfo {
    pub endian: Endian,
    pub pointer_width: MachineSize,
}

impl MachineInfo {
    pub fn target() -> MachineInfo {
        with(|cx| cx.target_info())
    }

    pub fn target_endianness() -> Endian {
        with(|cx| cx.target_info().endian)
    }

    pub fn target_pointer_width() -> MachineSize {
        with(|cx| cx.target_info().pointer_width)
    }
}

#[derive(Copy, Clone, PartialEq, Eq, Serialize)]
pub enum Endian {
    Little,
    Big,
}

/// Represent the size of a component.
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Serialize)]
pub struct MachineSize {
    num_bits: usize,
}

impl MachineSize {
    #[inline(always)]
    pub fn bytes(self) -> usize {
        self.num_bits / 8
    }

    #[inline(always)]
    pub fn bits(self) -> usize {
        self.num_bits
    }

    #[inline(always)]
    pub fn from_bits(num_bits: usize) -> MachineSize {
        MachineSize { num_bits }
    }

    #[inline]
    pub fn unsigned_int_max(self) -> Option<u128> {
        (self.num_bits <= 128).then(|| u128::MAX >> (128 - self.bits()))
    }
}
