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

【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> {}

二、代码解析

  1. 基本设计理念
  • 使用类型系统在编译期表示数值

  • 通过嵌套泛型结构体表示二进制位

  • 支持整数和实数(科学计数法)表示

  1. 核心类型定义
    基本标记类型:

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的幂次(也用二进制表示)

  1. 类型别名

定义常用数字和逻辑值:


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
  1. 构造方法

提供方便的构造方式:


// 构造以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
  1. 密封特质(Sealed)

防止外部实现这些特质,保持类型安全:


impl Sealed for B<H, L> {}
impl Sealed for D<Int, Exp10> {}
// ...其他类型的Sealed实现
  1. 数值表示示例
  • 整数:

    • 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)

  1. 特点
  • 编译期计算:所有数值在编译期确定

  • 类型安全:通过类型系统保证操作合法性

  • 零成本抽象:运行时无额外开销

  • 可扩展性:可以添加各种运算的类型级实现

这种设计常用于需要编译期数值计算和验证的场景,如维度检查、单位系统等。

http://www.dtcms.com/a/285476.html

相关文章:

  • IDEA插件离线安装
  • Vue3 Anime.js超级炫酷的网页动画库详解
  • 完整的 Meteor NPM 集成
  • 游戏常用运行库合集下载 - 提升游戏与软件体验
  • Nestjs框架: 基于TypeORM的多租户功能集成
  • Linux C 进程间通信基本操作
  • QT Windows 资源管理器的排序规则
  • 通俗易懂:什么是决策树?
  • 禁止拖动视频进度条来保障视频安全?
  • MBIST - Memory BIST会对memory进行清零吗?
  • QGIS二次开发环境搭建(qgis-3.28.6+qt5.15)
  • Telink BLE 低电压检测
  • AI IDE冲击下JetBrains作死,IDEA埋订阅陷阱
  • Redis中字符串类型的实现原理
  • 数据通信与计算机网络——模拟传输
  • websocket案例 599足球比分
  • 计算机网络知名端口分配全表(0-1023)
  • 网络原理——UDP
  • 【论文精读】基于共识的分布式量子分解算法用于考虑最优传输线切换的安全约束机组组合
  • 游戏盾在非游戏行业的应用:跨界守护网络安全的新利器
  • 初探 Web 环境下的 LLM 安全:攻击原理与风险边界
  • Mock 单元测试
  • 如何上传github(解决git的时候输入正确的账号密码,但提示认证失败)
  • 撤销和重做!支持数据驱动的事务机制啦(使用OpenGL+QT开发三维CAD)
  • LatentSync: 一键自动生成对嘴型的视频
  • 医疗人工智能的心电图分析:创新技术与临床应用
  • 【playwright篇】教程(十六)[macOS+playwright相关问题]
  • 【Linux 中断机制:工作队列与中断线程化详解】
  • 5 种可行的方法:如何将 Redmi 联系人备份到 Mac
  • RustDesk 自建中继服务器教程(Mac mini)