Merge rust-bitcoin/rust-bitcoin#4542: Fix FeeRate::checked_add/sub
395252c6d9
Fix FeeRate::checked_add/sub (Tobin C. Harding)
Pull request description:
Currently the `checked_add` and `checked_sub` functions use a `u64` for the right hand side. This leaks the inner unit because the RHS value is implicitly in the same unit.
Make the functions have `FeeRate` on the RHS.
ACKs for top commit:
apoelstra:
ACK 395252c6d95fdd581ce5e8ad5d7978515aafea23; successfully ran local tests; will one-ACK merge as this is units-only
Tree-SHA512: 1f0893f75c47f720ac741ace0274171ed24efcb6d2724d0fed941899d43b213e165b97aa050d6e40eea78c527af45d090a81b9d6cbd95835ef7105585786fca6
This commit is contained in:
commit
7dcff506dd
|
@ -110,9 +110,9 @@ impl FeeRate {
|
||||||
///
|
///
|
||||||
/// Computes `self + rhs` returning [`None`] if overflow occurred.
|
/// Computes `self + rhs` returning [`None`] if overflow occurred.
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub const fn checked_add(self, rhs: u64) -> Option<Self> {
|
pub const fn checked_add(self, rhs: FeeRate) -> Option<Self> {
|
||||||
// No `map()` in const context.
|
// No `map()` in const context.
|
||||||
match self.to_sat_per_kwu().checked_add(rhs) {
|
match self.to_sat_per_kwu().checked_add(rhs.to_sat_per_kwu()) {
|
||||||
Some(res) => Some(Self::from_sat_per_kwu(res)),
|
Some(res) => Some(Self::from_sat_per_kwu(res)),
|
||||||
None => None,
|
None => None,
|
||||||
}
|
}
|
||||||
|
@ -122,9 +122,9 @@ impl FeeRate {
|
||||||
///
|
///
|
||||||
/// Computes `self - rhs` returning [`None`] if overflow occurred.
|
/// Computes `self - rhs` returning [`None`] if overflow occurred.
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub const fn checked_sub(self, rhs: u64) -> Option<Self> {
|
pub const fn checked_sub(self, rhs: FeeRate) -> Option<Self> {
|
||||||
// No `map()` in const context.
|
// No `map()` in const context.
|
||||||
match self.to_sat_per_kwu().checked_sub(rhs) {
|
match self.to_sat_per_kwu().checked_sub(rhs.to_sat_per_kwu()) {
|
||||||
Some(res) => Some(Self::from_sat_per_kwu(res)),
|
Some(res) => Some(Self::from_sat_per_kwu(res)),
|
||||||
None => None,
|
None => None,
|
||||||
}
|
}
|
||||||
|
@ -250,19 +250,24 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn checked_add() {
|
fn checked_add() {
|
||||||
let f = FeeRate::from_sat_per_kwu(1).checked_add(2).unwrap();
|
let one = FeeRate::from_sat_per_kwu(1);
|
||||||
assert_eq!(FeeRate::from_sat_per_kwu(3), f);
|
let two = FeeRate::from_sat_per_kwu(2);
|
||||||
|
let three = FeeRate::from_sat_per_kwu(3);
|
||||||
|
|
||||||
let f = FeeRate::from_sat_per_kwu(u64::MAX).checked_add(1);
|
assert_eq!(one.checked_add(two).unwrap(), three);
|
||||||
|
|
||||||
|
let f = FeeRate::from_sat_per_kwu(u64::MAX).checked_add(one);
|
||||||
assert!(f.is_none());
|
assert!(f.is_none());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn checked_sub() {
|
fn checked_sub() {
|
||||||
let f = FeeRate::from_sat_per_kwu(2).checked_sub(1).unwrap();
|
let one = FeeRate::from_sat_per_kwu(1);
|
||||||
assert_eq!(FeeRate::from_sat_per_kwu(1), f);
|
let two = FeeRate::from_sat_per_kwu(2);
|
||||||
|
let three = FeeRate::from_sat_per_kwu(3);
|
||||||
|
assert_eq!(three.checked_sub(two).unwrap(), one);
|
||||||
|
|
||||||
let f = FeeRate::ZERO.checked_sub(1);
|
let f = FeeRate::ZERO.checked_sub(one);
|
||||||
assert!(f.is_none());
|
assert!(f.is_none());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue