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

【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.xdnf.cn/news/15694.html

相关文章:

  • Python 使用期物处理并发(使用concurrent.futures模块下载)
  • Leetcode刷题营第三十三题:对称二叉树
  • 五大开源OCR开源框架评估01-Tesseract:OCR 领域的远古巨神
  • Docker安装教程
  • GaussDB join 连接的用法
  • 7.18 Java基础 |
  • 正则表达式,Collection集合,迭代器
  • 差分数组算法
  • [simdjson] 填充字符串 | `document` 对象 | on-demand 模式
  • C++并发编程-14. 利用栅栏实现同步
  • Redis学习其三(订阅发布,主从复制,哨兵模式)
  • Windows 安装WSL +Docker 部署通义千问大模型(同步解决Ubuntu启动命令闪退)
  • 图片平铺下去总是有个缝隙的解决方案
  • Vue常见指令
  • 【解码文本世界的“隐形分界线”:Windows与Linux回车换行之谜】
  • Python网络爬虫之selenium库
  • coredns使用etcd
  • Gitee 远程库多人如何协作?
  • CCF编程能力等级认证GESP—C++1级—20250628
  • QT窗口(4)-浮动窗口
  • Kotlin封装
  • 萤石摄像头C++SDK应用实例
  • 微信小程序 wx.request() 的封装
  • Github库镜像到本地私有Gitlab服务器
  • PortSwigger Labs 之 点击劫持利用
  • RPC 与 Feign 的区别笔记
  • Spring AI开发智能客服(Tool calling)
  • 开启modbus tcp模拟调试
  • 【LeetCode 热题 100】199. 二叉树的右视图——(解法一)BFS
  • 自己动手实现 strlen:从循环到递归的四种写法