Мне нужна функция Rust, позволяющая добавлять тип u32
(u64
, u128
) к типу i32
(i64
, i128
) при проверке на переполнение.
Моя реализация:
/// Add u32 to i32. In case of an overflow, return None.
fn checked_add_i32_u32(a: i32, b: u32) -> Option<i32> {
let b_half = (b / 2) as i32;
let b_rem = (b % 2) as i32;
Some(a.checked_add(b_half)?.checked_add(b_half)?
.checked_add(b_rem)?)
}
/// Add u64 to i64. In case of an overflow, return None.
fn checked_add_i64_u64(a: i64, b: u64) -> Option<i64> {
let b_half = (b / 2) as i64;
let b_rem = (b % 2) as i64;
Some(a.checked_add(b_half)?.checked_add(b_half)?
.checked_add(b_rem)?)
}
У меня есть другая похожая программа, которая делает то же самое для u128
и i128
.Я чувствую, что повторяюсь.Мои тесты для этих функций также выглядят очень похоже.
Есть ли способ, которым я мог бы реорганизовать свой код и вместо него иметь только одну функцию?Я не уверен, как обобщать отношения между u32
и i32
(или u64
и i64
, u128
и i128
).