当前位置: 首页 > news >正文

【PhysUnits】15.16 补充to_i32方法的类型级整数表示(basic.rs)

一、源码

这段代码实现了一个类型级别的整数系统,使用Rust的类型系统来表示和操作整数。这种技术在依赖类型编程和类型安全API设计中很有用。

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 Integer: Default+Sealed + Copy + Default + 'static {fn to_i32(&self) -> i32;//新补充的方法
}
pub trait NonZero: Integer {}
pub trait NonOne: Integer {}
pub trait NonNegOne: Integer {}
pub trait Unsigned: Integer {}// ========== NonZero 实现 ==========
impl NonZero for P1 {}
impl NonZero for N1 {}
impl<H: NonZero> NonZero for B0<H> {}
impl<H: NonZero> NonZero for B1<H> {}// ========== Integer 实现 ==========
// Z0 表示 0
impl Integer for Z0 {#[inline(always)]fn to_i32(&self) -> i32 {0}
}// P1 表示 +1
impl Integer for P1 {#[inline(always)]fn to_i32(&self) -> i32 {1}
}// N1 表示 -1
impl Integer for N1 {#[inline(always)]fn to_i32(&self) -> i32 {-1}
}// B0<H> 表示 H * 2
impl<H: NonZero> Integer for B0<H> {#[inline(always)]fn to_i32(&self) -> i32 {H::default().to_i32() * 2}
}// B1<H> 表示 H * 2 + 1
impl<H: NonZero> Integer for B1<H> {#[inline(always)]fn to_i32(&self) -> i32 {H::default().to_i32() * 2 + 1}
}// ========== 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 Z0 {}
impl Unsigned for P1 {}
impl<H: NonZero + NonNegOne> Unsigned for B0<H> {}
impl<H: NonZero + NonNegOne> Unsigned for B1<H> {}// ========== 构造函数 ==========
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}
}

二、基础类型定义

  1. 二进制位类型:
  • B0: 表示一个以0结尾的二进制数,H是更高位

  • B1: 表示一个以1结尾的二进制数,H是更高位

  1. 基本数值类型:
  • Z0: 表示数字0

  • P1: 表示数字+1 (新增)

  • N1: 表示数字-1

这些类型都使用了PhantomData来保持类型参数而不需要实际值,并实现了常见的trait如Eq, PartialEq, Clone, Copy, Debug等。

三、特质(Trait)系统

  1. Integer特质:
  • 所有整数类型的基特质

  • 要求实现Default, Sealed, Copy等

  • 新增了to_i32()方法将类型级整数转换为运行时值

  1. 子特质:
  • NonZero: 非零数

  • NonOne: 非一数

  • NonNegOne: 非负一数

  • Unsigned: 无符号数

四、数值表示规则

  • Z0 = 0

  • P1 = +1

  • N1 = -1

  • B0 = H * 2

  • B1 = H * 2 + 1

例如:

  • B1<B0> 表示 P1 * 2 = 2 (B0) 然后 2 * 2 + 1 = 5 (B1)

五、特质实现

代码为各种组合实现了适当的特质:

  • 非零数(NonZero)包括所有除了Z0的数

  • 非一数(NonOne)包括所有除了P1的数

  • 无符号数(Unsigned)包括所有非负数

六、构造函数

为每种类型提供了new()构造函数,方便创建实例。

七、使用场景

这种类型级整数系统可以用于:

  • 类型安全的状态机

  • 维度检查

  • 编译时计算

  • 确保某些值在编译时满足特定条件(如非零、正数等)

通过这种方式,可以在编译时捕获更多错误,而不需要运行时检查。

相关文章:

  • 【西门子杯工业嵌入式-1-基本环境与空白模板】
  • 如何排查MySQL是否走索引
  • 是否存在路径(FIFOBB算法)
  • 人工智能100问☞第41问:什么是边缘AI?
  • Java应用10(客户端与服务器通信)
  • 【运维心得】内存占用虚标真相
  • DisplayPort 2.0协议介绍(1)
  • 基于BI PaaS架构的衡石HENGSHI SENSE平台技术解析:重塑企业级数据分析基座
  • MySQL的并发事务问题及事务隔离级别
  • 人脸识别技术应用备案材料详细解析
  • C语言| 指针引用数组元素
  • 芒种耕耘时,codigger智启新程
  • label-studio的使用教程(导入本地路径)
  • 深入解析OSPF特殊区域类型
  • Modbus TCP 通信基础
  • ServBay 1.13.0 更新,新增第三方反向代理/内网穿透
  • DFS训练(网格图)
  • 2024年09月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • SpringBoot自动化部署实战技术文章大纲
  • 【Fiddler抓取手机数据包】
  • 湖南sem优化/福州seo顾问
  • 中国网页设计师网站/销售渠道都有哪些
  • 建设行政主管部门官方网站/驻马店网站seo
  • wordpress商城支付宝/网站内部优化有哪些内容
  • 高端建站骗局/seo排名优化代理
  • 国外黄冈网站推广软件免费吗/全网搜索