【PhysUnits】15 完善的类型整数基本结构体(basic.rs)
一、源码
这段代码定义了一个类型系统,用于表示不同类型的数字(正数、负数、零、非零数等),并通过 trait 来标记这些类型的性质。
use crate::sealed::Sealed;
use core::marker::PhantomData;// ========== 基础类型定义 ==========
#[derive(Eq, PartialEq, Clone, Copy, Debug)]
pub struct B0<H>(pub PhantomData<H>);#[derive(Eq, PartialEq, Clone, Copy, Debug)]
pub struct B1<H>(pub PhantomData<H>);#[derive(Eq, PartialEq, Clone, Copy, Debug, Default)]
pub struct Z0;#[derive(Eq, PartialEq, Clone, Copy, Debug, Default)]
pub struct P1;//新增#[derive(Eq, PartialEq, Clone, Copy, Debug, Default)]
pub struct N1;impl<H> Default for B0<H>{fn default() -> Self{B0(PhantomData)}
}impl<H> Default for B1<H>{fn default() -> Self{B1(PhantomData)}
}// ========== Sealed 实现 ==========
impl<H> Sealed for B0<H> {}
impl<H> Sealed for B1<H> {}
impl Sealed for Z0 {}
impl Sealed for P1 {}
impl Sealed for N1 {}// ========== 标记特质定义 ==========
pub trait Positive: Sealed {}
pub trait Negative: Sealed {}
pub trait Integer: Sealed + Copy + Default + 'static {}
pub trait NonZero: Integer {}
pub trait NonOne: Integer {}
pub trait NonNegOne: Integer {}
pub trait Unsigned: Integer {}// ========== Positive 实现 ==========
impl Positive for P1 {} //原先B1<Z0>替换为P1
impl<H: Positive> Positive for B0<H> {}
impl<H: Positive> Positive for B1<H> {}// ========== Negative 实现 ==========
impl Negative for N1 {}
impl<H: Negative> Negative for B0<H> {}
impl<H: Negative> Negative for B1<H> {}// ========== NonZero 实现 ==========
impl NonZero for P1 {}
impl NonZero for N1 {}
impl<H: NonZero> NonZero for B0<H> {}
impl<H: NonZero> NonZero for B1<H> {}// ========== Integer 实现 ==========
impl Integer for P1 {}
impl Integer for N1 {}
impl<H: NonZero> Integer for B0<H> {}
impl<H: NonZero> Integer for B1<H> {}
impl Integer for Z0 {} //现在Z0仅单独使用// ========== NonOne 实现 ==========
impl NonOne for Z0 {}
impl NonOne for N1 {}
impl<H: NonZero> NonOne for B0<H> {}
impl<H: NonZero> NonOne for B1<H> {}// ========== NonNegOne 实现 ==========
impl NonNegOne for Z0 {}
impl NonNegOne for P1 {}
impl<H: NonZero> NonNegOne for B0<H> {}
impl<H: NonZero> NonNegOne for B1<H> {}// ========== Unsigned 实现 ==========
impl Unsigned for P1 {}
impl<H: NonZero + Positive> Unsigned for B0<H> {}
impl<H: NonZero + Positive> Unsigned for B1<H> {}
impl Unsigned for Z0 {}// ========== 构造函数 ==========
impl<H> B0<H> {#[inline]pub fn new() -> Self {B0(PhantomData)}
}impl<H> B1<H> {#[inline]pub fn new() -> Self {B1(PhantomData)}
}impl P1 {#[inline]pub fn new() -> Self {P1}
}impl N1 {#[inline]pub fn new() -> Self {N1}
}impl Z0 {#[inline]pub fn new() -> Self {Z0}
}
二、基础类型定义
定义了五种基本类型:
-
B0 和 B1:泛型结构体,用于构建更复杂的数字类型。
-
Z0:表示数字0
-
P1:表示数字+1(新增的)
-
N1:表示数字-1
这些类型都派生了一些常见 trait(Eq, PartialEq, Clone, Copy, Debug)并实现了 Default trait。
三、Sealed实现
为所有基础类型实现了 Sealed trait。Sealed 是一个标记 trait,用于限制这些 trait 只能在本模块中被实现(防止外部类型实现这些 trait)。
四、标记特质定义
定义了一系列 trait 来标记数字的性质:
-
Positive:正数
-
Negative:负数
-
Integer:整数(所有数字类型的基 trait)
-
NonZero:非零
-
NonOne:非一
-
NonNegOne:非负一
-
Unsigned:无符号数(零或正数)
五、各种特质的实现
为不同类型实现了上述特质:
-
Positive:P1 和所有以 P1 为基础构建的正数
-
Negative:N1 和所有以 N1 为基础构建的负数
-
NonZero:所有不等于零的数
-
Integer:所有整数类型
-
NonNegOne:除了N1,其他都是非负一数
-
Unsigned:P1和它们的组合是无符号数,Z0也是
六、构造函数
为所有类型提供了 new() 构造函数,方便创建实例。
七、设计目的
这个系统用来在类型级别表示和操作数字的,用于:
-
可以确保某个函数只接受正数类型
-
可以在编译期区分零和非零
-
可以构建更复杂的数字类型(如 B1<B0> 表示二进制形式的正数5)
八、特点
-
零(Z0)现在是独立类型,不再像之前可能作为B0、B1的符号位
-
新增了P1直接表示+1,简化了正数的表示,即与B0、B1配合使用时表示符号为正,该位为1,更高位都是0。
-
使用类型参数H可以构建更复杂的数字(如B1<B0>表示5的二进制形式数字)
-
使用泛型和类型组合来表示更复杂的数字
-
通过 trait 约束来确保类型安全
-
零 (Z0) 是一个独立的类型,不再与B0、B1组合使用
-
N1和新增的P1作为基本构建块,替代了之前可能使用的 B1
这种设计常见于需要编译期验证的领域,如维度检查、单位系统等。