【PhysUnits】12 加法操作(add.rs)
一、源码
这是一个类型级二进制数加法系统。
use super::basic::{B0, B1, Z0, N1, Integer, NonZero, NonNegOne};
use core::ops::Add;
use super::add1::Add1;
use super::sub1::Sub1;// ==================== Helper Traits ====================
pub trait AddB0B0Result {type Output;fn new_output() -> Self::Output;
}pub trait AddB1B0Result {type Output;fn new_output() -> Self::Output;
}// ==================== 运算符重载 ====================
/// Z0加整数
impl<I: Integer> Add<I> for Z0 {type Output = I;#[inline]fn add(self, rhs: I) -> Self::Output {rhs}
}/// 非零加Z0
//N1+Z0
impl Add<Z0> for N1 {type Output = N1;#[inline]fn add(self, _rhs: Z0) -> Self::Output {self}
}/// B0<H> 加 Z0
impl<H: Integer> Add<Z0> for B0<H> {type Output = Self;#[inline]fn add(self, _rhs: Z0) -> Self::Output {self}
}/// B1<H> 加 Z0
impl<H: Integer> Add<Z0> for B1<H> {type Output = Self;#[inline]fn add(self, _rhs: Z0) -> Self::Output {self}
}/// N1加非0数
impl<N: NonZero> Add<N> for N1
whereN: Add1,<N as Add1>::Output: Default,
{type Output = <N as Add1>::Output;#[inline]fn add(self, _: N) -> Self::Output {<N as Add1>::Output::default()}
}/// 非0非-1加N1
impl<H: Sub1 + Integer> Add<N1> for B0<H>
whereB0<H>: Sub1,<B0<H> as Sub1>::Output: Default,
{type Output = <B0<H> as Sub1>::Output;#[inline]fn add(self, _: N1) -> Self::Output {<B0<H> as Sub1>::Output::default()}
}impl Add<N1> for B1<Z0>{type Output = Z0;#[inline]fn add(self, _: N1) -> Self::Output {Z0}
}impl<H: NonZero> Add<N1> for B1<H>{type Output = B0<H>;#[inline]fn add(self, _: N1) -> Self::Output {B0::<H>::default()}
}// ==================== B0 + B0 ====================
impl<I1: Integer, I2: Integer> Add<B0<I2>> for B0<I1>
whereI1: Add<I2>,<I1 as Add<I2>>::Output: AddB0B0Result,
{type Output = <<I1 as Add<I2>>::Output as AddB0B0Result>::Output;#[inline]fn add(self, _rhs: B0<I2>) -> Self::Output {<<I1 as Add<I2>>::Output as AddB0B0Result>::new_output()}
}// ==================== B0 + B1 ====================
impl<I1: Integer, I2: Integer> Add<B1<I2>> for B0<I1>
whereI1: Add<I2>,<I1 as Add<I2>>::Output: NonNegOne,
{type Output = B1<<I1 as Add<I2>>::Output>;#[inline]fn add(self, _rhs: B1<I2>) -> Self::Output {B1::new()}
}// ==================== B1 + B0 ====================
impl<I1: Integer, I2: Integer> Add<B0<I2>> for B1<I1>
whereI1: Add<I2>,<I1 as Add<I2>>::Output: AddB1B0Result,
{type Output = <<I1 as Add<I2>>::Output as AddB1B0Result>::Output;#[inline]fn add(self, _rhs: B0<I2>) -> Self::Output {<<I1 as Add<I2>>::Output as AddB1B0Result>::new_output()}
}// ==================== B1 + B1 ====================
impl<I1: Integer, I2: Integer> Add<B1<I2>> for B1<I1>
whereI1: Add<I2>,<I1 as Add<I2>>::Output: Add1,<<I1 as Add<I2>>::Output as Add1>::Output: AddB0B0Result,
{type Output = B0<<<<I1 as Add<I2>>::Output as Add1>::Output as AddB0B0Result>::Output>;#[inline]fn add(self, _rhs: B1<I2>) -> Self::Output {B0::new()}
}// ==================== AddB0B0Result 实现 ====================
impl<I: Integer + NonZero> AddB0B0Result for I {type Output = B0<I>;#[inline]fn new_output() -> Self::Output {B0::new()}
}impl AddB0B0Result for Z0 {type Output = Z0;#[inline]fn new_output() -> Self::Output {Z0::new()}
}// ==================== AddB1B0Result 实现 ====================
impl<I: Integer + NonNegOne> AddB1B0Result for I {type Output = B1<I>;#[inline]fn new_output() -> Self::Output {B1::new()}
}impl AddB1B0Result for N1 {type Output = N1;#[inline]fn new_output() -> Self::Output {N1::new()}
}
二、基础类型定义
系统定义了4种核心类型:
-
Z0:表示数字0
-
N1:表示数字-1
-
B0:二进制0,H表示更高位
-
B1:二进制1,H表示更高位
三、特质(Trait)系统
定义了多个标记特质来描述数字属性:
-
Integer:标记整数类型
-
NonZero:标记非零数
-
NonNegOne:标记不是-1的数
-
Positive/Negative:标记正负数
四、加法实现的核心逻辑
加法辅助特质
-
AddB0B0Result:处理B0 + B0的结果
-
AddB1B0Result:处理B1 + B0的结果
特殊加法规则
-
Z0 + 任何数:返回该数本身
-
任何数 + Z0:返回该数本身
-
N1 + 非零数:使用Add1特质计算结果
-
非零非-1数 + N1:使用Sub1特质计算结果
二进制加法规则
- B0 + B0:
-
递归相加内部类型
-
结果为B0或Z0(当内部结果为Z0时)
- B0 + B1:
-
递归相加内部类型
-
结果总是B1
- B1 + B0:
-
递归相加内部类型
-
结果为B1或N1(当内部结果为N1时)
- B1 + B1:
-
递归相加内部类型
-
进位处理(使用Add1)
-
结果为B0并进位
五、关键设计点
-
类型级递归:通过泛型递归表示任意长度的二进制数
-
模式匹配:使用不同的trait实现来处理不同的加法情况
-
规范化输出:自动处理B0→Z0和B1→N1的转换
-
进位处理:B1+B1会产生进位,通过Add1特质实现
六、示例说明
-
B1表示1 (0b1)
-
B0<B1>表示2 (0b10)
-
B1<B1>表示3 (0b11)
当计算B1 + B1(1+1)时:
-
内部Z0 + Z0 = Z0
-
应用Add1得到B1
-
最终结果为B0<B1>(即2)
这个系统实现了类型安全的二进制数加法,所有计算都在编译期完成,没有运行时开销。