From 4e95b484fc767cb960c72761b32769dfe945130f Mon Sep 17 00:00:00 2001 From: MrCroxx Date: Mon, 18 Nov 2024 17:33:28 +0800 Subject: [PATCH 1/2] feat: impl Sub and SubAssign for bytesize Signed-off-by: MrCroxx --- src/lib.rs | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 5d04d38..ac3e06d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -39,7 +39,7 @@ use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; use std::convert::TryFrom; use std::fmt::{self, Debug, Display, Formatter}; -use std::ops::{Add, AddAssign, Mul, MulAssign}; +use std::ops::{Add, AddAssign, Mul, MulAssign, Sub, SubAssign}; /// byte size for 1 byte pub const B: u64 = 1; @@ -284,6 +284,43 @@ where } } +impl Sub for ByteSize { + type Output = ByteSize; + + #[inline(always)] + fn sub(self, rhs: ByteSize) -> ByteSize { + ByteSize(self.0 - rhs.0) + } +} + +impl SubAssign for ByteSize { + #[inline(always)] + fn sub_assign(&mut self, rhs: ByteSize) { + self.0 -= rhs.0 + } +} + +impl Sub for ByteSize +where + T: Into, +{ + type Output = ByteSize; + #[inline(always)] + fn sub(self, rhs: T) -> ByteSize { + ByteSize(self.0 - (rhs.into())) + } +} + +impl SubAssign for ByteSize +where + T: Into, +{ + #[inline(always)] + fn sub_assign(&mut self, rhs: T) { + self.0 -= rhs.into(); + } +} + impl Mul for ByteSize where T: Into, @@ -380,6 +417,8 @@ mod tests { assert_eq!((x + y).as_u64(), 1_100_000u64); + assert_eq!((x - y).as_u64(), 900_000u64); + assert_eq!((x + (100 * 1000) as u64).as_u64(), 1_100_000); assert_eq!((x * 2u64).as_u64(), 2_000_000); @@ -403,6 +442,14 @@ mod tests { assert_eq!((x + B as u8).as_u64(), 1_000_001); + assert_eq!((x - MB as u64).as_u64(), 0); + + assert_eq!((x - MB as u32).as_u64(), 0); + + assert_eq!((x - KB as u32).as_u64(), 999_000); + + assert_eq!((x - B as u32).as_u64(), 999_999); + x += MB as u64; x += MB as u32; x += 10u16; From da9d34576fbdd87379995baa70f9e2cdc979996e Mon Sep 17 00:00:00 2001 From: MrCroxx Date: Mon, 18 Nov 2024 22:54:27 +0800 Subject: [PATCH 2/2] docs: record updates in the changelog Signed-off-by: MrCroxx --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3cc2adb..8f17df9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,3 +3,7 @@ ## Unreleased - Use SI format by default with `Display`. - Use "KiB" for SI unit. +- Implement `Sub` for `ByteSize`. +- Implement `Sub>` for `ByteSize`. +- Implement `SubAssign` for `ByteSize`. +- Implement `SubAssign>` for `ByteSize`. \ No newline at end of file