From b1f4d48e956c6b6599b666248e5aa157b9660dca Mon Sep 17 00:00:00 2001 From: Andreas Grois Date: Tue, 18 Oct 2022 07:56:16 +0200 Subject: First draft of (untested) iterative conversion. --- src/passwordmaker/base_conversion/division.rs | 32 +++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/passwordmaker/base_conversion/division.rs (limited to 'src/passwordmaker/base_conversion/division.rs') diff --git a/src/passwordmaker/base_conversion/division.rs b/src/passwordmaker/base_conversion/division.rs new file mode 100644 index 0000000..c6fc911 --- /dev/null +++ b/src/passwordmaker/base_conversion/division.rs @@ -0,0 +1,32 @@ +/// A trait that combines std::ops::Div and std::ops::Rem, as those can often be computed together. +pub(super) trait Division where Self:Sized { + /// does in-place arbitrary-length division. Returns remainder. + fn divide(self, divisor : &D) -> DivisionResult; + fn is_zero(&self) -> bool; +} + +/// Or mark your type as `UseGenericDivision` to just use `/` and `%` operators for types. Makes only sense for integers. +pub(super) trait UseGenericDivision : Clone + + for <'a> std::ops::Div<&'a Self, Output = Self> + + for <'a> std::ops::Rem<&'a Self, Output = Self> + + Default + + Eq {} + + impl Division for U + where U: UseGenericDivision +{ + fn divide(self, divisor : &Self) -> DivisionResult { + DivisionResult { + result: self.clone().div(divisor), + remainder: self.rem(divisor) + } + } + fn is_zero(&self) -> bool { + *self == Self::default() + } +} + +pub(super) struct DivisionResult { + pub result : T, + pub remainder : U, +} \ No newline at end of file -- cgit v1.2.3