moa_types 0.1.0

通用类型与宏定义
Documentation
//! 通用类型与宏定义
#![no_std]

/// ABI 安全的布尔类型(`#[repr(transparent)]` over `u32`)
///
/// 避免 `bool` 在 `#[repr(C)]` 结构体中的 UB 风险和对齐浪费。
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct AbiBool(u32);

impl AbiBool {
    /// ABI 安全的 false(值为 0)
    pub const FALSE: Self = Self(0);
    /// ABI 安全的 true(值为 1)
    pub const TRUE: Self = Self(1);

    /// 从 `bool` 构造
    pub const fn from_bool(val: bool) -> Self {
        Self(val as u32)
    }

    /// 转换为 `bool`
    pub const fn to_bool(self) -> bool {
        self.0 != 0
    }
}

impl From<bool> for AbiBool {
    fn from(val: bool) -> Self {
        Self::from_bool(val)
    }
}

impl From<AbiBool> for bool {
    fn from(val: AbiBool) -> Self {
        val.to_bool()
    }
}

/// 定义一个 newtype 包装类型
///
/// 自动生成 `from_raw` / `raw` 方法和常用派生。
#[macro_export]
macro_rules! define_newtype {
    ($(#[$meta:meta])* $vis:vis struct $name:ident($inner:ty);) => {
        $(#[$meta])*
        #[repr(transparent)]
        #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
        $vis struct $name($inner);

        impl $name {
            /// 从原始值构造
            pub const fn from_raw(val: $inner) -> Self {
                Self(val)
            }

            /// 获取原始值
            pub const fn raw(self) -> $inner {
                self.0
            }
        }
    };
}