From: Simon Tatham Date: Sat, 12 Apr 2025 07:26:11 +0000 (+0100) Subject: Expose Vec-based initialisation publicly X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ian/git?a=commitdiff_plain;h=1cc860591a00a5f3f49858f3c2d230d1f3ec9cd2;p=nimber.git Expose Vec-based initialisation publicly --- diff --git a/src/finitenimber.rs b/src/finitenimber.rs index 38c7bf8..92596ee 100644 --- a/src/finitenimber.rs +++ b/src/finitenimber.rs @@ -221,6 +221,18 @@ impl From for FiniteNimber { } } +impl From> for FiniteNimber { + fn from(val: Vec) -> 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> 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,