#arithmetic #u64 #operations #basic #structs #arithmetic-operations #eth

struct-arithmetic

为您的结构体提供派生基本算术运算的特质

8个版本

0.3.3 2022年2月24日
0.3.2 2022年2月17日
0.2.2 2022年2月7日
0.2.1 2022年1月26日
0.1.0 2021年11月29日

#754过程宏

每月47次下载

MIT 协议

27KB
575 代码行

结构体算术派生

#[derive(StructArithmetic)]
struct TokenMap {
    pub sol: u64,
    pub eth: u64,
    pub btc: u64,
}

转换为

struct TokenMap {
    pub sol: u64,
    pub eth: u64,
    pub btc: u64,
}
impl TokenMap {
    pub fn new(sol: u64, eth: u64, btc: u64) -> TokenMap {
        TokenMap {
            sol,
            eth,
            btc,
        }
    }
    pub fn add(&self, other: TokenMap) -> TokenMap {
        TokenMap::new(
            sol: self.sol.checked_add(other.sol).unwrap(),
            eth: self.eth.checked_add(other.eth).unwrap(),
            btc: self.btc.checked_add(other.btc).unwrap(),
        )
    }
    pub fn add_assign(&mut self, other: TokenMap) {
        self.sol = self.sol.checked_sub(other.sol).unwrap();
        self.eth = self.eth.checked_sub(other.eth).unwrap();
        self.btc = self.btc.checked_sub(other.btc).unwrap();
    }
    ...
}

您还可以添加一个 _reserved 字段(仅当类型为 [u8; N]! 时)它不会干扰算术运算。

#[derive(StructArithmetic)]
struct TokenMap {
    pub sol: u64,
    pub eth: u64,
    pub btc: u64,
    pub _reserved: [u8; 100],
}

转换为

struct TokenMap {
    pub sol: u64,
    pub eth: u64,
    pub btc: u64,
    pub _reserved: [u8; 100],
}
impl TokenMap {
    pub fn new(sol: u64, eth: u64, btc: u64) -> TokenMap {
        TokenMap {
            sol,
            eth,
            btc,
            _reserved: [0; 100],
        }
    }
    pub fn add(&self, other: TokenMap) -> TokenMap {
        TokenMap::new(
            sol: self.sol.checked_add(other.sol).unwrap(),
            eth: self.eth.checked_add(other.eth).unwrap(),
            btc: self.btc.checked_add(other.btc).unwrap(),
        )
    }
    pub fn add_assign(&mut self, other: TokenMap) {
        self.sol = self.sol.checked_sub(other.sol).unwrap();
        self.eth = self.eth.checked_sub(other.eth).unwrap();
        self.btc = self.btc.checked_sub(other.btc).unwrap();
    }
    ...

它还支持添加和使用非保留的固定长度数组。

struct TokenMap {
    pub sol: u64,
    pub eth: u64,
    pub btc: u64,
    pub tk1: [u64; 2],
    pub _reserved: [u8; 128],
    pub tk2: [u128; 3],
}

转换为

struct TokenMap {
    pub sol: u64,
    pub eth: u64,
    pub btc: u64,
    pub tk1: [u64; 2],
    pub _reserved: [u8; 128],
    pub _reserved2: [u8; 256],
    pub tk2: [u128; 3],
}

impl TokenMap {
    pub fn new(sol: u64, eth: u64, btc: u64, tk1: [u64; 2], tk2: [u128; 3]) -> TokenMap {
        TokenMap {
            sol,
            eth,
            btc,
            tk1,
            _reserved: [0; 128],
            _reserved2: [0; 256],
            tk2,
        }
    }
    pub fn add(&self, other: &TokenMap) -> Option<TokenMap> {
        let mut tk1 = [u64::default(); 2];
        for i in 0..self.tk1.len() {
            tk1[i] = self.tk1[i].checked_add(other.tk1[i])?;
        }
        let mut tk2 = [u128::default(); 3];
        for i in 0..self.tk2.len() {
            tk2[i] = self.tk2[i].checked_add(other.tk2[i])?;
        }
        Some(TokenMap::new(
            self.sol.checked_add(other.sol)?,
            self.eth.checked_add(other.eth)?,
            self.btc.checked_add(other.btc)?,
            tk1,
            tk2,
        ))
    }
    pub fn add_assign(&mut self, other: &TokenMap) -> Option<()> {
        self.sol = self.sol.checked_add(other.sol)?;
        self.eth = self.eth.checked_add(other.eth)?;
        self.btc = self.btc.checked_add(other.btc)?;
        for i in 0..self.tk1.len() {
            self.tk1[i] = self.tk1[i].checked_add(other.tk1[i])?;
        }
        for i in 0..self.tk2.len() {
            self.tk2[i] = self.tk2[i].checked_add(other.tk2[i])?;
        }
        Some(())
    }
}

依赖项

~1.5MB
~35K SLoC