From: Simon Tatham Date: Thu, 10 Apr 2025 11:49:34 +0000 (+0100) Subject: Allow FiniteNimber based on a slice. X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ian/git?a=commitdiff_plain;h=fa3834f12f9f9b91eb009faaead6abef39f00e2a;p=nimber.git Allow FiniteNimber based on a slice. This should make it easier to partition things. --- 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]))); } }