8个版本
0.3.3 | 2022年2月24日 |
---|---|
0.3.2 |
|
0.2.2 | 2022年2月7日 |
0.2.1 | 2022年1月26日 |
0.1.0 | 2021年11月29日 |
#754 在 过程宏
每月47次下载
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