pub(crate) enum ByteOrder {
Be,
Le,
}
pub(crate) trait TwosComplement {
fn to_twos_complement(&mut self, order: ByteOrder);
}
macro_rules! impl_twos_complement {
($($t:ty),*) => {
$(
impl TwosComplement for [$t] {
fn to_twos_complement(&mut self, order: ByteOrder) {
let size: usize = self.len();
let mut carry: bool = true;
match order {
ByteOrder::Le => {
for item in self.iter_mut().take(size) {
let sum: $t =
(!(*item)).wrapping_add(if carry { 1 } else { 0 });
carry = sum < (carry as $t);
*item = sum;
}
}
ByteOrder::Be => {
for item in self.iter_mut().rev().take(size) {
let sum: $t =
(!(*item)).wrapping_add(if carry { 1 } else { 0 });
carry = sum < (carry as $t);
*item = sum;
}
}
}
}
}
)*
}
}
impl_twos_complement!(u8, u16, u32, u64, u128, usize);