From fa3834f12f9f9b91eb009faaead6abef39f00e2a Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Thu, 10 Apr 2025 12:49:34 +0100 Subject: [PATCH] Allow FiniteNimber based on a slice. This should make it easier to partition things. --- .rustfmt.toml | 1 + src/finitenimber.rs | 51 ++++++++++++++++++++++++++++++++++++++------- src/lib.rs | 5 +++++ 3 files changed, 50 insertions(+), 7 deletions(-) create mode 100644 .rustfmt.toml diff --git a/.rustfmt.toml b/.rustfmt.toml new file mode 100644 index 0000000..a1ffd27 --- /dev/null +++ b/.rustfmt.toml @@ -0,0 +1 @@ +max_width = 79 diff --git a/src/finitenimber.rs b/src/finitenimber.rs index 5fa9852..828ee64 100644 --- a/src/finitenimber.rs +++ b/src/finitenimber.rs @@ -1,8 +1,10 @@ -use std::ops::BitXor; use std::fmt::Debug; +use std::ops::BitXor; -pub trait FiniteNimberBase : BitXor + Clone + Eq + Debug + Sized { - type Owned: FiniteNimberBase; +pub trait FiniteNimberBase: + BitXor + Eq + Debug + Sized +{ + type Owned: FiniteNimberBase + Clone; fn to_owned(self) -> Self::Owned; } @@ -10,24 +12,59 @@ pub trait FiniteNimberBase : BitXor + Clone + Eq + Debug + Sized { impl FiniteNimberBase for u64 { type Owned = Self; - fn to_owned(self) -> Self::Owned {self} + fn to_owned(self) -> Self::Owned { + self + } } #[derive(Clone, PartialEq, Eq, Debug)] pub struct IntVector(pub Vec); +#[derive(PartialEq, Eq, Debug)] +pub struct IntSlice<'a>(pub &'a [u64]); + impl BitXor for IntVector { type Output = Self; fn bitxor(self, other: Self) -> Self { - Self(self.0.into_iter().zip(other.0.into_iter()).map(|(a,b)| a ^ b).collect()) + Self( + self.0 + .into_iter() + .zip(other.0.into_iter()) + .map(|(a, b)| a ^ b) + .collect(), + ) + } +} + +impl BitXor for IntSlice<'_> { + type Output = IntVector; + + fn bitxor(self, other: Self) -> IntVector { + IntVector( + self.0 + .iter() + .zip(other.0.iter()) + .map(|(a, b)| a ^ b) + .collect(), + ) } } impl FiniteNimberBase for IntVector { type Owned = Self; - fn to_owned(self) -> Self::Owned {self} + fn to_owned(self) -> Self::Owned { + self + } +} + +impl FiniteNimberBase for IntSlice<'_> { + type Owned = IntVector; + + fn to_owned(self) -> Self::Owned { + IntVector(self.0.into()) + } } #[derive(Clone, PartialEq, Eq, Debug)] @@ -45,6 +82,6 @@ impl std::ops::Add> for FiniteNimber { type Output = FiniteNimber; fn add(self, other: Self) -> Self::Output { - Self::Output::new((self.n ^ other.n).to_owned()) + Self::Output::new(self.n ^ other.n) } } diff --git a/src/lib.rs b/src/lib.rs index 496d053..d40eed0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,7 @@ mod finitenimber; pub use finitenimber::FiniteNimber; +pub use finitenimber::IntSlice; pub use finitenimber::IntVector; #[cfg(test)] @@ -16,5 +17,9 @@ mod tests { let a = FiniteNimber::new(IntVector(vec![1, 1, 0, 0])); let b = FiniteNimber::new(IntVector(vec![1, 0, 1, 0])); assert_eq!(a + b, FiniteNimber::new(IntVector(vec![0, 1, 1, 0]))); + + let a = FiniteNimber::new(IntSlice(&[1, 1, 0, 0])); + let b = FiniteNimber::new(IntSlice(&[1, 0, 1, 0])); + assert_eq!(a + b, FiniteNimber::new(IntVector(vec![0, 1, 1, 0]))); } } -- 2.30.2