【unitrix】 5.0 第二套类型级二进制数基本结构体(types2.rs)

发布于:2025-07-14 ⋅ 阅读:(16) ⋅ 点赞:(0)

一、源码

这是一个使用 Rust 类型系统实现类型级(type-level)二进制数的设计。

//! 类型级二进制数表示方案(第二套方案)
//!
//! 使用嵌套泛型结构体表示二进制数,支持整数和小数表示。

use crate::sealed::Sealed;

/// 类型级二进制数结构体
///
/// # 泛型参数说明
/// - `H`: 高位部分
///   - `I` 表示高位为1
///   - `O` 表示高位为0
///   - `B<H, L>` 表示嵌套的高位
///   - `Null` 仅用于顶层结构,表示无更高位
/// - `L`: 低位部分
///   - `I` 表示低位为1
///   - `O` 表示低位为0
///   - `B<H, L>` 表示小数部分
///   - `Null` 仅用于顶层结构,表示无小数部分
///
/// # 表示规则
/// - 整数部分使用嵌套的B结构体表示
/// - 小数部分通过低位的B结构体表示
/// - 规范化表示要求嵌套的B结构体高位不能为Null
#[derive(Eq, PartialEq, Clone, Copy, Debug)]
pub struct B<H, L>(pub H, pub L);

/// 空类型标记,用于表示无更高位或无小数部分
#[derive(Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Debug, Default)]
pub struct Null;

impl Null {
    /// 创建新的Null实例
    #[inline(always)]
    pub const fn new() -> Self {
        Null
    }
}

impl<H: Default, L: Default> Default for B<H, L> {
    fn default() -> Self {
        B(Default::default(), Default::default())
    }
}

impl<H, L> B<H, L> {
    /// 创建新的二进制数实例
    #[inline]
    pub fn new(h: H, l: L) -> Self {
        B(h, l)
    }
}

/// 类型级比特位0(逻辑假)
#[derive(Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Debug, Default)]
pub struct O;

impl O {
    /// 创建新的O实例
    #[inline(always)]
    pub const fn new() -> Self {
        Self
    }
}

/// 类型级比特位1(逻辑真)
#[derive(Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Debug, Default)]
pub struct I;

impl I {
    /// 创建新的I实例
    #[inline(always)]
    pub const fn new() -> Self {
        I
    }
}

// 为类型实现密封标记
impl<H, L> Sealed for B<H, L> {}
impl Sealed for O {}
impl Sealed for I {}
impl Sealed for Null {}

二、源码分析

  1. 核心设计理念:
  • 使用泛型结构体 B<H, L> 表示二进制数,其中 H 是高位,L 是低位

  • 通过类型组合来表示任意长度的二进制数

  • 支持整数和小数的表示

  1. 主要类型定义:

pub struct B<H, L>(pub H, pub L);
  • 二元组结构体,H 表示高位,L 表示低位

  • 可以嵌套使用来表示多位二进制数

  1. 基本位类型:

pub struct O;  // 表示二进制0
pub struct I;  // 表示二进制1
pub struct Null;  // 表示空/无更高位

4. 类型组合示例:

+ B<I, O> 表示二进制补码 "10" (十进制-2)

+ B<B<O, I>, O> 表示二进制 "010" (十进制2)

+ B<I, B<I, Null>> 可以表示二进制 "1.1" (小数)

+ B<I, Null> 可以表示二进制 "1.0" (小数)

5. 实现细节:

+ 所有类型都实现了常见的 trait (Eq, Debug)以便于使用

+ 提供了 new() 构造函数

+ 实现了 Default trait

+ 使用 Sealed trait 进行封装保护

6. 规范化规则:

+ 嵌套的 B 结构体高位不能为 Null

+ Null 只用于顶层结构表示边界

7. 使用场景:

+ 类型级编程

+ 编译期计算

+ 类型安全的二进制操作

这种设计的主要优点是:

+ 完全在类型系统层面实现,无运行时开销

+ 类型安全 - 非法状态无法表示

+ 可扩展 - 可以表示任意长度的二进制数

+ 支持小数表示

典型用例可能包括:

+ 硬件寄存器映射

+ 精确数值计算

+ 协议解析

+ 类型安全的位操作

这个实现展示了 Rust 强大的类型系统和泛型能力,能够在编译期保证二进制数的正确性。


网站公告

今日签到

点亮在社区的每一天
去签到