chiark / gitweb /
Don't keep recomputing levels during multiplication
authorSimon Tatham <anakin@pobox.com>
Sat, 12 Apr 2025 07:22:30 +0000 (08:22 +0100)
committerSimon Tatham <anakin@pobox.com>
Sat, 12 Apr 2025 07:22:30 +0000 (08:22 +0100)
src/finitenimber.rs

index 58e403e65a907a3304beb5bdc790c0950ddf39c9..52c830d533d7fb323270566c51405a0dcc646014 100644 (file)
@@ -316,12 +316,8 @@ impl<'a> FiniteNimberRef<'a> {
             None => self.into(),
         }
     }
-}
 
-impl<'a, 'b> Mul<FiniteNimberRef<'a>> for FiniteNimberRef<'b> {
-    type Output = FiniteNimber;
-    fn mul(self, other: FiniteNimberRef<'a>) -> FiniteNimber {
-        let level = max(self.level(), other.level());
+    fn mul_recurse(self, other: FiniteNimberRef<'a>, level: usize) -> FiniteNimber {
         match level.checked_sub(1) {
             Some(sublevel) => {
                 let (alo, ahi) = self.split(sublevel);
@@ -341,6 +337,14 @@ impl<'a, 'b> Mul<FiniteNimberRef<'a>> for FiniteNimberRef<'b> {
     }
 }
 
+impl<'a, 'b> Mul<FiniteNimberRef<'a>> for FiniteNimberRef<'b> {
+    type Output = FiniteNimber;
+    fn mul(self, other: FiniteNimberRef<'a>) -> FiniteNimber {
+        let level = max(self.level(), other.level());
+        self.mul_recurse(other, level)
+    }
+}
+
 impl_binop_wrappers!(Add, add);
 impl_binop_wrappers!(Sub, sub);
 impl_binop_wrappers!(Mul, mul);