【unitrix】 4.15 类型级别的数字减一操作实现(sub1.rs)

源码

这段代码实现了一个类型级别的数字减一操作(Sub1 trait),主要用于编译时的类型计算。

//! 类型级别的数字减一操作实现
//!
//! # 元信息
//! - 编制人: $ource
//! - 版本: 0版完成版
//! - 创建时间: 2025年7月2日
//! - 最后修改时间: 无
//! - 待完善问题: Float + 1 未实现
//!
//! # 实现规则
//! 1. 基础类型处理:
//!    - Z0 → N1
//!    - P1 → Z0
//!    - N1 → B0
//! 2. 借位处理:
//!    - B0: 产生借位,结果为 B1
//!    - B1: 直接减一,结果为 B0
//! 3. 特殊处理:
//!    - B0 有特化实现
//! 4. 小数处理:
//!    - 整数部分直接减一

use crate::number::{
    Z0, P1, N1, B0, B1, FixedPoint,
    NonZero, NonOne, Unsigned, TypedInt
};

/// 类型级别数字减一操作
///
/// # 关联类型
/// - `Output`: 执行减一操作后的结果类型
pub trait Sub1 {
    type Output: Default;
}

// ==================== 基础类型实现 ====================

impl Sub1 for Z0 {
    type Output = N1;
}

impl Sub1 for P1 {
    type Output = Z0;
}

impl Sub1 for N1 {
    type Output = B0<N1>;
}

// ==================== 递归类型实现 ====================

/// 处理 B0 类型的减一操作
///
/// 产生借位,结果为 B1
impl<H: NonZero + NonOne + Sub1> Sub1 for B0<H> {
    type Output = B1<H::Output>;
}

/// 处理 B1 类型的减一操作
///
/// 直接减一,结果为 B0
impl<H: NonZero> Sub1 for B1<H> {
    type Output = B0<H>;
}

// ==================== 特化实现 ====================

/// 特殊处理 B0 类型的减一操作
impl Sub1 for B0<P1> {
    type Output = P1;
}

// ==================== FixedPoint 实现 ====================

/// FixedPoint 类型的减一操作
///
/// 对整数部分执行减一操作,小数部分保持不变
impl<I: TypedInt + Sub1, F: Unsigned> Sub1 for FixedPoint<I, F> {
    type Output = FixedPoint<<I as Sub1>::Output, F>;
}

二、源码分析

  1. 基础概念
  • 类型级别数字:在编译时表示数字的类型,而不是运行时的值。

  • Sub1 trait:定义了一个减一操作,关联类型Output表示减一后的结果类型。

  1. 数字表示

代码中使用了多种类型表示不同数字:

  • Z0:表示数字0

  • P1:表示正数1

  • N1:表示负数-1

  • B0和B1:表示更复杂的数字结构(带借位的数字)

  1. 实现规则
基础类型处理

impl Sub1 for Z0 { type Output = N1; }  // 0 -1 = -1
impl Sub1 for P1 { type Output = Z0; }  // 1 -1 = 0
impl Sub1 for N1 { type Output = B0<N1>; }  // -1 -1 = -2 (表示为B0)
借位处理

// B0 -1 = B1 (产生借位)
impl<H: NonZero + NonOne + Sub1> Sub1 for B0<H> {
    type Output = B1<H::Output>;
}

// B1 -1 = B0 (直接减一)
impl<H: NonZero> Sub1 for B1<H> {
    type Output = B0<H>;
}
特化实现

// B0 -1 = P1 (特殊处理)
impl Sub1 for B0<P1> {
    type Output = P1;
}
定点数处理

// FixedPoint -1 = FixedPoint (只减整数部分)
impl<I: TypedInt + Sub1, F: Unsigned> Sub1 for FixedPoint<I, F> {
    type Output = FixedPoint<<I as Sub1>::Output, F>;
}
  1. 特点
  • 编译时计算:所有计算都在类型系统层面完成,不产生运行时开销。

  • 递归处理:通过递归的trait实现处理复杂的数字结构。

  • 定点数支持:可以处理带有小数部分的定点数。

  1. 待完善问题

目前还未实现对浮点数加1的操作(“Float + 1 未实现”)。

这种类型级别的数字操作在需要编译时计算的场景(如维度检查、模板元编程等)中非常有用。

你可能感兴趣的:(我的unitrix库,rust)