chiark / gitweb /
Expose Vec-based initialisation publicly
authorSimon Tatham <anakin@pobox.com>
Sat, 12 Apr 2025 07:26:11 +0000 (08:26 +0100)
committerSimon Tatham <anakin@pobox.com>
Sat, 12 Apr 2025 07:26:11 +0000 (08:26 +0100)
src/finitenimber.rs

index 38c7bf84874a8b21d75f26879bfc7c02df4892af..92596ee5a7b0caee189f6b79790f09e1146a4f4e 100644 (file)
@@ -221,6 +221,18 @@ impl From<Word> for FiniteNimber {
     }
 }
 
+impl From<Vec<Word>> for FiniteNimber {
+    fn from(val: Vec<Word>) -> FiniteNimber {
+        FiniteNimber(val)
+    }
+}
+
+impl From<&[Word]> for FiniteNimber {
+    fn from(val: &[Word]) -> FiniteNimber {
+        FiniteNimber(val.into())
+    }
+}
+
 macro_rules! impl_binop_wrappers {
     ($trait:tt, $fn:ident) => {
         impl $trait<FiniteNimberRef<'_>> for FiniteNimber {
@@ -361,7 +373,7 @@ mod tests {
 
     #[test]
     fn split() {
-        let a = FiniteNimber(vec![
+        let a = FiniteNimber::from(vec![
             0x8786858483828180,
             0x9796959493929190,
             0xa7a6a5a4a3a2a1a0,
@@ -373,31 +385,31 @@ mod tests {
         let (loref, hiref) = a.to_ref().split(4);
         let lo: FiniteNimber = loref.into();
         let hi: FiniteNimber = hiref.into();
-        assert_eq!(lo, FiniteNimber(vec![0x8180]));
-        assert_eq!(hi, FiniteNimber(vec![0x8382]));
+        assert_eq!(lo, FiniteNimber::from(vec![0x8180]));
+        assert_eq!(hi, FiniteNimber::from(vec![0x8382]));
 
         let (loref, hiref) = a.to_ref().split(5);
         let lo: FiniteNimber = loref.into();
         let hi: FiniteNimber = hiref.into();
-        assert_eq!(lo, FiniteNimber(vec![0x83828180]));
-        assert_eq!(hi, FiniteNimber(vec![0x87868584]));
+        assert_eq!(lo, FiniteNimber::from(vec![0x83828180]));
+        assert_eq!(hi, FiniteNimber::from(vec![0x87868584]));
 
         let (loref, hiref) = a.to_ref().split(6);
         let lo: FiniteNimber = loref.into();
         let hi: FiniteNimber = hiref.into();
-        assert_eq!(lo, FiniteNimber(vec![0x8786858483828180]));
-        assert_eq!(hi, FiniteNimber(vec![0x9796959493929190]));
+        assert_eq!(lo, FiniteNimber::from(vec![0x8786858483828180]));
+        assert_eq!(hi, FiniteNimber::from(vec![0x9796959493929190]));
 
         let (loref, hiref) = a.to_ref().split(7);
         let lo: FiniteNimber = loref.into();
         let hi: FiniteNimber = hiref.into();
         assert_eq!(
             lo,
-            FiniteNimber(vec![0x8786858483828180, 0x9796959493929190])
+            FiniteNimber::from(vec![0x8786858483828180, 0x9796959493929190])
         );
         assert_eq!(
             hi,
-            FiniteNimber(vec![0xa7a6a5a4a3a2a1a0, 0xb7b6b5b4b3b2b1b0,])
+            FiniteNimber::from(vec![0xa7a6a5a4a3a2a1a0, 0xb7b6b5b4b3b2b1b0,])
         );
 
         let (loref, hiref) = a.to_ref().split(8);
@@ -405,7 +417,7 @@ mod tests {
         let hi: FiniteNimber = hiref.into();
         assert_eq!(
             lo,
-            FiniteNimber(vec![
+            FiniteNimber::from(vec![
                 0x8786858483828180,
                 0x9796959493929190,
                 0xa7a6a5a4a3a2a1a0,
@@ -414,7 +426,7 @@ mod tests {
         );
         assert_eq!(
             hi,
-            FiniteNimber(vec![0xc7c6c5c4c3c2c1c0, 0xd7d6d5d4d3d2d1d0])
+            FiniteNimber::from(vec![0xc7c6c5c4c3c2c1c0, 0xd7d6d5d4d3d2d1d0])
         );
 
         let (loref, hiref) = a.to_ref().split(9);
@@ -422,7 +434,7 @@ mod tests {
         let hi: FiniteNimber = hiref.into();
         assert_eq!(
             lo,
-            FiniteNimber(vec![
+            FiniteNimber::from(vec![
                 0x8786858483828180,
                 0x9796959493929190,
                 0xa7a6a5a4a3a2a1a0,
@@ -431,27 +443,27 @@ mod tests {
                 0xd7d6d5d4d3d2d1d0
             ])
         );
-        assert_eq!(hi, FiniteNimber(vec![0]));
+        assert_eq!(hi, FiniteNimber::from(vec![0]));
 
-        let a = FiniteNimber(vec![0xFF]);
+        let a = FiniteNimber::from(vec![0xFF]);
 
         let (loref, hiref) = a.to_ref().split(0);
         let lo: FiniteNimber = loref.into();
         let hi: FiniteNimber = hiref.into();
-        assert_eq!(lo, FiniteNimber(vec![1]));
-        assert_eq!(hi, FiniteNimber(vec![1]));
+        assert_eq!(lo, FiniteNimber::from(vec![1]));
+        assert_eq!(hi, FiniteNimber::from(vec![1]));
 
         let (loref, hiref) = a.to_ref().split(1);
         let lo: FiniteNimber = loref.into();
         let hi: FiniteNimber = hiref.into();
-        assert_eq!(lo, FiniteNimber(vec![3]));
-        assert_eq!(hi, FiniteNimber(vec![3]));
+        assert_eq!(lo, FiniteNimber::from(vec![3]));
+        assert_eq!(hi, FiniteNimber::from(vec![3]));
 
         let (loref, hiref) = a.to_ref().split(2);
         let lo: FiniteNimber = loref.into();
         let hi: FiniteNimber = hiref.into();
-        assert_eq!(lo, FiniteNimber(vec![0xf]));
-        assert_eq!(hi, FiniteNimber(vec![0xf]));
+        assert_eq!(lo, FiniteNimber::from(vec![0xf]));
+        assert_eq!(hi, FiniteNimber::from(vec![0xf]));
     }
 
     #[test]
@@ -470,36 +482,36 @@ mod tests {
         );
         assert_eq!(
             a.to_ref().join(b.to_ref(), 6),
-            FiniteNimber(vec![0x5, 0xa])
+            FiniteNimber::from(vec![0x5, 0xa])
         );
         assert_eq!(
             a.to_ref().join(b.to_ref(), 8),
-            FiniteNimber(vec![0x5, 0, 0, 0, 0xa])
+            FiniteNimber::from(vec![0x5, 0, 0, 0, 0xa])
         );
     }
 
     #[test]
     fn levels() {
-        assert_eq!(FiniteNimber(vec![]).to_ref().level(), 0);
-        assert_eq!(FiniteNimber(vec![0]).to_ref().level(), 0);
-        assert_eq!(FiniteNimber(vec![1]).to_ref().level(), 0);
-        assert_eq!(FiniteNimber(vec![2]).to_ref().level(), 1);
-        assert_eq!(FiniteNimber(vec![3]).to_ref().level(), 1);
-        assert_eq!(FiniteNimber(vec![4]).to_ref().level(), 2);
-        assert_eq!(FiniteNimber(vec![0xf]).to_ref().level(), 2);
-        assert_eq!(FiniteNimber(vec![0x10]).to_ref().level(), 3);
-        assert_eq!(FiniteNimber(vec![0xff]).to_ref().level(), 3);
-        assert_eq!(FiniteNimber(vec![0x0100]).to_ref().level(), 4);
-        assert_eq!(FiniteNimber(vec![0xffff]).to_ref().level(), 4);
-        assert_eq!(FiniteNimber(vec![0x00010000]).to_ref().level(), 5);
-        assert_eq!(FiniteNimber(vec![0xffffffff]).to_ref().level(), 5);
-        assert_eq!(FiniteNimber(vec![0x0000000100000000]).to_ref().level(), 6);
-        assert_eq!(FiniteNimber(vec![0xffffffffffffffff]).to_ref().level(), 6);
-
-        assert_eq!(FiniteNimber(vec![0x55, 0, 0, 0]).to_ref().level(), 3);
-        assert_eq!(FiniteNimber(vec![0x55, 1, 0, 0]).to_ref().level(), 7);
-        assert_eq!(FiniteNimber(vec![0x55, 1, 1, 0]).to_ref().level(), 8);
-        assert_eq!(FiniteNimber(vec![0x55, 1, 1, 1]).to_ref().level(), 8);
+        assert_eq!(FiniteNimber::from(vec![]).to_ref().level(), 0);
+        assert_eq!(FiniteNimber::from(vec![0]).to_ref().level(), 0);
+        assert_eq!(FiniteNimber::from(vec![1]).to_ref().level(), 0);
+        assert_eq!(FiniteNimber::from(vec![2]).to_ref().level(), 1);
+        assert_eq!(FiniteNimber::from(vec![3]).to_ref().level(), 1);
+        assert_eq!(FiniteNimber::from(vec![4]).to_ref().level(), 2);
+        assert_eq!(FiniteNimber::from(vec![0xf]).to_ref().level(), 2);
+        assert_eq!(FiniteNimber::from(vec![0x10]).to_ref().level(), 3);
+        assert_eq!(FiniteNimber::from(vec![0xff]).to_ref().level(), 3);
+        assert_eq!(FiniteNimber::from(vec![0x0100]).to_ref().level(), 4);
+        assert_eq!(FiniteNimber::from(vec![0xffff]).to_ref().level(), 4);
+        assert_eq!(FiniteNimber::from(vec![0x00010000]).to_ref().level(), 5);
+        assert_eq!(FiniteNimber::from(vec![0xffffffff]).to_ref().level(), 5);
+        assert_eq!(FiniteNimber::from(vec![0x0000000100000000]).to_ref().level(), 6);
+        assert_eq!(FiniteNimber::from(vec![0xffffffffffffffff]).to_ref().level(), 6);
+
+        assert_eq!(FiniteNimber::from(vec![0x55, 0, 0, 0]).to_ref().level(), 3);
+        assert_eq!(FiniteNimber::from(vec![0x55, 1, 0, 0]).to_ref().level(), 7);
+        assert_eq!(FiniteNimber::from(vec![0x55, 1, 1, 0]).to_ref().level(), 8);
+        assert_eq!(FiniteNimber::from(vec![0x55, 1, 1, 1]).to_ref().level(), 8);
     }
 
     #[test]
@@ -508,9 +520,9 @@ mod tests {
         let b = FiniteNimber::from(0b1010);
         assert_eq!(a + b, FiniteNimber::from(0b0110));
 
-        let a = FiniteNimber(vec![1, 1, 0, 0]);
-        let b = FiniteNimber(vec![1, 0, 1, 0]);
-        assert_eq!(a + b, FiniteNimber(vec![0, 1, 1, 0]));
+        let a = FiniteNimber::from(vec![1, 1, 0, 0]);
+        let b = FiniteNimber::from(vec![1, 0, 1, 0]);
+        assert_eq!(a + b, FiniteNimber::from(vec![0, 1, 1, 0]));
     }
 
     #[test]
@@ -522,7 +534,7 @@ mod tests {
         assert_eq!(a.to_ref().mul_by_h(3), FiniteNimber::from(128));
         assert_eq!(
             a.to_ref().mul_by_h(8),
-            FiniteNimber(vec![0, 0, 0, 0x8000000000000000])
+            FiniteNimber::from(vec![0, 0, 0, 0x8000000000000000])
         );
 
         assert_eq!(
@@ -531,7 +543,7 @@ mod tests {
         );
         assert_eq!(
             a.to_ref().mul_by_h(8).to_ref().mul_by_h(8),
-            FiniteNimber(vec![
+            FiniteNimber::from(vec![
                 0xa92181714b010a1a,
                 0x4a88a921e2208b6b,
                 0xe3a92850a9218171,
@@ -553,7 +565,7 @@ mod tests {
         );
 
         assert_eq!(
-            FiniteNimber(vec![
+            FiniteNimber::from(vec![
                 0x3f84d5b5b5470917,
                 0xc0ac29b7c97c50dd,
                 0xbe5466cf34e90c6c,
@@ -562,7 +574,7 @@ mod tests {
                 0xa4093822299f31d0,
                 0x13198a2e03707344,
                 0x243f6a8885a308d3,
-            ]) * FiniteNimber(vec![
+            ]) * FiniteNimber::from(vec![
                 0x4f7c7b5757f59584,
                 0xda06c80abb1185eb,
                 0xf4bf8d8d8c31d763,
@@ -572,7 +584,7 @@ mod tests {
                 0xbf7158809cf4f3c7,
                 0xb7e151628aed2a6a,
             ]),
-            FiniteNimber(vec![
+            FiniteNimber::from(vec![
                 0x72890f944be121d8,
                 0xe6429b02014feb2e,
                 0x2454070e4408eff8,