【unitrix】 6.7 基本结构体(types.rs)
一、源码
这是一个使用 Rust 类型系统实现类型级二进制数的方案,通过泛型和嵌套结构体在编译期表示数值。
//! 类型级二进制数表示方案
//!
//! 使用嵌套泛型结构体表示二进制数,支持整数和实数表示。
//!
//! ## 表示规则
//! - 整数部分: `B<高位, 低位>` 结构体
//! - `B<Null, O>` = 0
//! - `B<Null, I>` = -1
//! - `B<B<Null, O>, I>` = 1
//! - 实数部分: `D<整数部分, 10的幂次>`
//! - `D<Int, Exp10>` = Int × 10^Exp10use crate::sealed::Sealed;// 基本类型定义
#[derive(Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Debug, Default)]
pub struct Null; // 终止标记#[derive(Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Debug, Default)]
pub struct O; // 比特0#[derive(Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Debug, Default)]
pub struct I; // 比特1/// 二进制数结构体
/// - H: 高位部分 (B<H,L> 或 Null)
/// - L: 低位部分 (I 或 O)
#[derive(Eq, PartialEq, Clone, Copy, Debug, Default)]
pub struct B<H, L> {pub(crate) h: H,pub(crate) l: L,
}/// 十进制科学计数法
/// - Int: 二进制整数部分
/// - Exp10: 10的幂次(二进制表示)
#[derive(Eq, PartialEq, Clone, Copy, Debug, Default)]
pub struct D<Int, Exp10>(pub Int, pub Exp10);/// 原生数值包装类型
#[derive(Eq, PartialEq, Debug, Clone, Copy, Default)]
pub struct V<T>(pub T);// 常用类型别名
pub type False = O; // 逻辑假
pub type True = I; // 逻辑真
pub type Z0 = B<Null, O>; // 0
pub type P1 = B<Z0, I>; // 1
pub type N1 = B<Null, I>; // -1
pub type N2 = B<N1, O>; // -2
pub type B0<H> = B<H, O>; // 以0结尾的数
pub type B1<H> = B<H, I>; // 以1结尾的数// 构造方法
impl<H> B<H, O> {#[inline]pub const fn b0(h: H) -> Self {B { h, l: O }}
}impl<H> B<H, I> {#[inline]pub const fn b1(h: H) -> Self {B { h, l: I }}
}impl<H, L> B<H, L> {#[inline]pub const fn new() -> Self {Self::default()}
}impl<Int, Exp10> D<Int, Exp10> {#[inline]pub const fn new() -> Self {Self::default()}
}impl Null {#[inline]pub const fn new() -> Self {Null}
}// 密封标记实现
impl<H, L> Sealed for B<H, L> {}
impl<Int, Exp10> Sealed for D<Int, Exp10> {}
impl Sealed for Null {}
impl Sealed for O {}
impl Sealed for I {}
impl<T> Sealed for V<T> {}
二、代码解析
- 基本设计理念
-
使用类型系统在编译期表示数值
-
通过嵌套泛型结构体表示二进制位
-
支持整数和实数(科学计数法)表示
- 核心类型定义
基本标记类型:
struct Null; // 终止标记,表示没有更高位
struct O; // 表示二进制位0
struct I; // 表示二进制位1
二进制数结构体 B<H, L>:
struct B<H, L> {h: H, // 高位部分l: L // 低位部分(只能是O或I)
}
表示规则:
-
B<Null, O> = 0
-
B<Null, I> = -1 (采用补码表示)
-
B<B<Null, O>, I> = 1 (正数需要前导零)
十进制科学计数法 D<Int, Exp10>:
struct D<Int, Exp10>(Int, Exp10);
表示 Int × 10^Exp10,其中:
-
Int 是二进制整数部分
-
Exp10 是10的幂次(也用二进制表示)
- 类型别名
定义常用数字和逻辑值:
type False = O; // 逻辑假
type True = I; // 逻辑真
type Z0 = B<Null, O>; // 0
type P1 = B<Z0, I>; // 1
type N1 = B<Null, I>; // -1
type N2 = B<N1, O>; // -2
- 构造方法
提供方便的构造方式:
// 构造以0结尾的数
B::<H>::b0(h) -> B<H, O>// 构造以1结尾的数
B::<H>::b1(h) -> B<H, I>// 默认构造
B::new() -> B<H, L>
D::new() -> D<Int, Exp10>
Null::new() -> Null
- 密封特质(Sealed)
防止外部实现这些特质,保持类型安全:
impl Sealed for B<H, L> {}
impl Sealed for D<Int, Exp10> {}
// ...其他类型的Sealed实现
- 数值表示示例
-
整数:
-
0: B<Null, O>
-
1: B<B<Null, O>, I>
-
-1: B<Null, I>
-
-2: B<B<Null, I>, O>
-
-
实数:
-
-0.1: D<N1, N1> (-1 × 10^-1)
-
20.0: D<B<P1, O>, P1> (2 × 10^1)
-
- 特点
-
编译期计算:所有数值在编译期确定
-
类型安全:通过类型系统保证操作合法性
-
零成本抽象:运行时无额外开销
-
可扩展性:可以添加各种运算的类型级实现
这种设计常用于需要编译期数值计算和验证的场景,如维度检查、单位系统等。