aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Grois <andi@grois.info>2022-10-20 20:17:03 +0200
committerAndreas Grois <andi@grois.info>2022-10-20 20:17:03 +0200
commitbe766f81b6985b9df3da39d78fb19ec4383075c7 (patch)
tree85f3fc8f9842a4ea248d124d7dea5f0417d3e444
parent6f7d6b8c18334da7f3e52afd2a822d5e8b190b6f (diff)
Minor: Shift Operation optimization.
-rw-r--r--src/passwordmaker/base_conversion/iterative_conversion_impl.rs14
1 files changed, 4 insertions, 10 deletions
diff --git a/src/passwordmaker/base_conversion/iterative_conversion_impl.rs b/src/passwordmaker/base_conversion/iterative_conversion_impl.rs
index 4e6747b..94c8b8b 100644
--- a/src/passwordmaker/base_conversion/iterative_conversion_impl.rs
+++ b/src/passwordmaker/base_conversion/iterative_conversion_impl.rs
@@ -10,7 +10,7 @@
//let's start with the simple case: u128
//we do need a NewType here, because actual u128 already has a Mul<&usize> implementation that does not match the version we want.
-use std::{ops::{DivAssign, Mul, SubAssign}, convert::{TryFrom, TryInto}, fmt::Display, error::Error, cmp::Ordering};
+use std::{ops::{DivAssign, Mul, SubAssign}, convert::{TryFrom, TryInto}, fmt::Display, error::Error, cmp::Ordering, iter::once};
use super::iterative_conversion::RemAssignWithQuotient;
@@ -441,13 +441,7 @@ impl<const N : usize> ArbitraryBytes<N>{
debug_assert!(s < 32);
let mut res = self.pad_with_a_zero();
if s != 0{
- let _ = res.0.iter_mut().rev().fold(0u32,|carry, val| {
- let c = *val >> (32 - s);
- *val <<= s;
- debug_assert!(*val & carry == 0);
- *val += carry;
- c
- });
+ res.0.iter_mut().zip(self.0.iter().chain(once(&0))).for_each(|(current, next)| *current = (*current << s) | (*next >> (32-s)));
}
res
}
@@ -459,7 +453,7 @@ impl<const N : usize> ArbitraryBytes<N>{
let c = *val << (32-s);
*val >>= s;
debug_assert!(*val & carry == 0);
- *val += carry;
+ *val |= carry;
c
});
}
@@ -522,7 +516,7 @@ mod iterative_conversion_impl_tests{
fn prepare_many_numbers() -> Vec<(ArbitraryBytes<5>,ArbitraryBytes<5>, u128, u128)>{
let mut rng = Xoshiro256Plus::seed_from_u64(0);
let mut res = Vec::new();
- for _i in 0..10000000 {
+ for _i in 0..1000000 {
let dx = rng.next_u32() % 3 + 2; //at least 2 digits, at max 4 (u128)
let dy = rng.next_u32() % 3 + 2;
let ds = dx.min(dy);