From f45209bfc74cbd69cfe3ca3f3312baefa8c5a731 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Thu, 10 Apr 2025 12:41:43 +0100 Subject: [PATCH] Allow variable-sized FiniteNimber. --- src/finitenimber.rs | 20 +++++++++++++++++++- src/lib.rs | 5 +++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/finitenimber.rs b/src/finitenimber.rs index 9b544f6..5fa9852 100644 --- a/src/finitenimber.rs +++ b/src/finitenimber.rs @@ -1,6 +1,7 @@ +use std::ops::BitXor; use std::fmt::Debug; -pub trait FiniteNimberBase : std::ops::BitXor + Clone + Eq + Debug + Sized { +pub trait FiniteNimberBase : BitXor + Clone + Eq + Debug + Sized { type Owned: FiniteNimberBase; fn to_owned(self) -> Self::Owned; @@ -12,6 +13,23 @@ impl FiniteNimberBase for u64 { fn to_owned(self) -> Self::Owned {self} } +#[derive(Clone, PartialEq, Eq, Debug)] +pub struct IntVector(pub Vec); + +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()) + } +} + +impl FiniteNimberBase for IntVector { + type Owned = Self; + + fn to_owned(self) -> Self::Owned {self} +} + #[derive(Clone, PartialEq, Eq, Debug)] pub struct FiniteNimber { n: T, diff --git a/src/lib.rs b/src/lib.rs index dcc764d..496d053 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,7 @@ mod finitenimber; pub use finitenimber::FiniteNimber; +pub use finitenimber::IntVector; #[cfg(test)] mod tests { @@ -11,5 +12,9 @@ mod tests { let a = FiniteNimber::new(0b1100u64); let b = FiniteNimber::new(0b1010u64); assert_eq!(a + b, FiniteNimber::new(0b0110u64)); + + 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]))); } } -- 2.30.2