use crate::VarInt;
use std::ops::Add;
impl Add for VarInt {
type Output = Self;
#[inline]
fn add(self, rhs: Self) -> Self::Output {
let (lhs, rhs) = Self::normalize(self, rhs);
match (lhs, rhs) {
(Self::I8(a), Self::I8(b)) => match a.checked_add(b) {
Some(v) => Self::I8(v),
None => Self::I16(a as i16 + b as i16),
},
(Self::I16(a), Self::I16(b)) => match a.checked_add(b) {
Some(v) => Self::I16(v),
None => Self::I32(a as i32 + b as i32),
},
(Self::I32(a), Self::I32(b)) => match a.checked_add(b) {
Some(v) => Self::I32(v),
None => Self::I64(a as i64 + b as i64),
},
(Self::I64(a), Self::I64(b)) => match a.checked_add(b) {
Some(v) => Self::I64(v),
None => Self::I128(a as i128 + b as i128),
},
(Self::I128(a), Self::I128(b)) => match a.checked_add(b) {
Some(v) => Self::I128(v),
None => panic!("overflow: {:?} + {:?}", a, b),
},
(lhs, rhs) => panic!("normalization failed: {:?} + {:?}", lhs, rhs),
}
}
}