Skip to content

Commit 8290027

Browse files
authored
Merge pull request #22 from pmnoxx/piotr-add-assign
add AddAssign operator to ByteSize
2 parents 3cb1a70 + 708b080 commit 8290027

File tree

1 file changed

+55
-19
lines changed

1 file changed

+55
-19
lines changed

Diff for: src/lib.rs

+55-19
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ mod parse;
3434
extern crate serde;
3535

3636
use std::fmt::{Debug, Display, Formatter, Result};
37-
use std::ops::{Add, Mul};
37+
use std::ops::{Add, AddAssign, Mul, MulAssign};
3838

3939
/// byte size for 1 byte
4040
pub const B: u64 = 1;
@@ -219,14 +219,6 @@ impl Debug for ByteSize {
219219

220220
macro_rules! commutative_op {
221221
($t:ty) => {
222-
impl Add<$t> for ByteSize {
223-
type Output = ByteSize;
224-
#[inline(always)]
225-
fn add(self, rhs: $t) -> ByteSize {
226-
ByteSize(self.0 + (rhs as u64))
227-
}
228-
}
229-
230222
impl Add<ByteSize> for $t {
231223
type Output = ByteSize;
232224
#[inline(always)]
@@ -235,14 +227,6 @@ macro_rules! commutative_op {
235227
}
236228
}
237229

238-
impl Mul<$t> for ByteSize {
239-
type Output = ByteSize;
240-
#[inline(always)]
241-
fn mul(self, rhs: $t) -> ByteSize {
242-
ByteSize(self.0 * (rhs as u64))
243-
}
244-
}
245-
246230
impl Mul<ByteSize> for $t {
247231
type Output = ByteSize;
248232
#[inline(always)]
@@ -267,25 +251,71 @@ impl Add<ByteSize> for ByteSize {
267251
}
268252
}
269253

254+
impl AddAssign<ByteSize> for ByteSize {
255+
#[inline(always)]
256+
fn add_assign(&mut self, rhs: ByteSize) {
257+
self.0 += rhs.0
258+
}
259+
}
260+
261+
impl<T> Add<T> for ByteSize
262+
where T: Into<u64> {
263+
type Output = ByteSize;
264+
#[inline(always)]
265+
fn add(self, rhs: T) -> ByteSize {
266+
ByteSize(self.0 + (rhs.into() as u64))
267+
}
268+
}
269+
270+
impl<T> AddAssign<T> for ByteSize
271+
where T: Into<u64> {
272+
#[inline(always)]
273+
fn add_assign(&mut self, rhs: T) {
274+
self.0 += rhs.into() as u64;
275+
}
276+
}
277+
278+
impl<T> Mul<T> for ByteSize
279+
where T: Into<u64> {
280+
type Output = ByteSize;
281+
#[inline(always)]
282+
fn mul(self, rhs: T) -> ByteSize {
283+
ByteSize(self.0 * (rhs.into() as u64))
284+
}
285+
}
286+
287+
impl<T> MulAssign<T> for ByteSize
288+
where T: Into<u64> {
289+
#[inline(always)]
290+
fn mul_assign(&mut self, rhs: T) {
291+
self.0 *= rhs.into() as u64;
292+
}
293+
}
294+
270295
#[cfg(test)]
271296
mod tests {
272297
use super::*;
273298

274299
#[test]
275300
fn test_arithmetic_op() {
276-
let x = ByteSize::mb(1);
301+
let mut x = ByteSize::mb(1);
277302
let y = ByteSize::kb(100);
278303

279304
assert_eq!((x + y).as_u64(), 1_100_000u64);
280305

281306
assert_eq!((x + (100 * 1000) as u64).as_u64(), 1_100_000);
282307

283308
assert_eq!((x * 2u64).as_u64(), 2_000_000);
309+
310+
x += y;
311+
assert_eq!(x.as_u64(), 1_100_000);
312+
x *= 2u64;
313+
assert_eq!(x.as_u64(), 2_200_000);
284314
}
285315

286316
#[test]
287317
fn test_arithmetic_primitives() {
288-
let x = ByteSize::mb(1);
318+
let mut x = ByteSize::mb(1);
289319

290320
assert_eq!((x + MB as u64).as_u64(), 2_000_000);
291321

@@ -294,6 +324,12 @@ mod tests {
294324
assert_eq!((x + KB as u16).as_u64(), 1_001_000);
295325

296326
assert_eq!((x + B as u8).as_u64(), 1_000_001);
327+
328+
x += MB as u64;
329+
x += MB as u32;
330+
x += 10 as u16;
331+
x += 1 as u8;
332+
assert_eq!(x.as_u64(), 3_000_011);
297333
}
298334

299335
#[test]

0 commit comments

Comments
 (0)