当前位置: 首页 > 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()构造函数,方便创建实例。

七、使用场景

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

  • 类型安全的状态机

  • 维度检查

  • 编译时计算

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

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

http://www.xdnf.cn/news/887905.html

相关文章:

  • wxpython快捷键示例
  • Python cryptography【密码库】库功能与使用指南
  • 模块化架构下的前端调试体系建设:WebDebugX 与多工具协同的工程实践
  • Sublime Text4 4192 安装
  • NGINX `ngx_stream_core_module` 模块概览
  • 数据分析后台设计指南:实战案例解析与5大设计要点总结
  • 实用对比图软件推荐:快速呈现信息差异
  • 【请关注】MySQL 碎片整理提升性能
  • 在Facebook平台有效结合TikTok跨境营销的方法
  • Calendar类日期设置进位问题
  • CSS3相关知识点
  • 《C++ 模板》
  • C# 中的 IRecipient
  • 网络安全全景解析
  • nvidia系列教程-agx-orin安装ros
  • DisplayPort 2.0协议介绍(1)
  • MCP协议在LLM系统中的架构与实现原理研究
  • 矩阵分解相关知识点总结(三)
  • 一日总结0605
  • 【Elasticsearch】Elasticsearch 核心技术(二):映射
  • es在Linux安装
  • 基于Docker Compose部署Java微服务项目
  • 项目根目录添加<meta>标签,记录当前部署版本、分支、时间
  • 分布式光纤传感(DAS)技术应用解析:从原理到落地场景
  • Python语法进阶篇 --- 类和对象
  • git连接本地仓库以及gitee
  • TypeScript进阶知识点
  • 14.AI搭建preparationのBERT预训练模型进行文本分类
  • 企业入驻成都芯谷金融中心·文化科技产业园优势深度解析
  • 浅谈 Linux 防火墙:从原理到实践