diff --git a/bsize/src/ops/mod.rs b/bsize/src/ops/mod.rs index 4c11810..a148de3 100644 --- a/bsize/src/ops/mod.rs +++ b/bsize/src/ops/mod.rs @@ -12,11 +12,36 @@ // See the License for the specific language governing permissions and // limitations under the License. +use core::iter; + +use crate::ByteSize; +use crate::traits::BaseByteSize; + #[cfg(feature = "nightly")] mod nightly; #[cfg(not(feature = "nightly"))] mod stable; +impl iter::Sum for ByteSize +where + T: BaseByteSize + iter::Sum, +{ + #[inline(always)] + fn sum>(iter: I) -> Self { + ByteSize(iter.map(ByteSize::bytes).sum()) + } +} + +impl<'a, T> iter::Sum<&'a ByteSize> for ByteSize +where + T: BaseByteSize + iter::Sum, +{ + #[inline(always)] + fn sum>>(iter: I) -> Self { + iter.copied().sum() + } +} + #[cfg(test)] mod tests { use crate::BSize; @@ -56,4 +81,16 @@ mod tests { size -= BSize::b(5); assert_eq!(size.bytes(), 3); } + + #[test] + fn sums_byte_sizes() { + let sizes = [BSize64::b(3), BSize64::b(5), BSize64::b(8)]; + + assert_eq!(sizes.into_iter().sum::(), BSize64::b(16)); + assert_eq!(sizes.iter().sum::(), BSize64::b(16)); + assert_eq!( + core::iter::empty::().sum::(), + BSize64::b(0) + ); + } }