【学Rust写CAD】10 加法器

发布于:2025-03-05 ⋅ 阅读:(111) ⋅ 点赞:(0)

源码

// src/matrix/adder.rs

/*
 * 说明:连加计算中,为提高运行期效率,用该结构增加一个Const变量,方便单独合并所有Const类型,最后一步才有可能出现Const与Val的加法计算
 */

 use std::ops::Add;

 use super::constant::{Constant, NotZeroConstant};
 use super::variable::{Variable, FloatType};
 use super::merge::Merge;
 
 /*
  * Adder 结构体:用于合并 Constant 和 Variable
  */
 #[derive(Debug, Clone, Copy, PartialEq)]
 pub struct Adder<const N: i32, T: FloatType>(pub Constant<N>, pub Variable<T>)
 where
     Constant<N>: NotZeroConstant;
 
 // Merge 实现
 impl<const N: i32, T: FloatType> Merge for Adder<N, T>
 where
     Constant<N>: NotZeroConstant,
     T: From<i32> + Add<Output = T>,
 {
     type Output = Variable<T>;
 
     #[inline]
     fn merge(self) -> Self::Output {
         Variable(T::from(N) + self.1.0)
     }
 }
 
 /*
  * 加法重载
  * 实现 Adder + (Const 或 Val)
  */
 // Adder + Const → Adder()
 impl<const N: i32, T: FloatType, const B: i32> Add<Constant<B>> for Adder<N, T>
 where
     Constant<N>: NotZeroConstant,
     Constant<{ N + B }>: Add<Variable<T>>,
 {
     type Output = <Constant<{ N + B }> as Add<Variable<T>>>::Output;
 
     #[inline]
     fn add(self, _b: Constant<B>) -> Self::Output {
         Constant::<{ N + B }> + self.1 // N+B分0、非0 2种情况,交给Const类处理
     }
 }
 
 // Adder + Variable 实现(假设 T = B)
 impl<const N: i32, T: FloatType> Add<Variable<T>> for Adder<N, T>
 where
     Constant<N>: NotZeroConstant,
     T: Add<T, Output = T>,
     Variable<T>: Add<Variable<T>, Output = Variable<T>>,
 {
     type Output = Self;
 
     #[inline]
     fn add(self, b: Variable<T>) -> Self::Output {
         Adder(self.0, self.1 + b)
     }
 }

网站公告

今日签到

点亮在社区的每一天
去签到