From: Simon Tatham Date: Thu, 10 Apr 2025 11:37:10 +0000 (+0100) Subject: Implement Add, via BitXor on the underlying type. X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ian/git?a=commitdiff_plain;h=3307763e61938fe52aac50bc6ce096f3df5d7c39;p=nimber.git Implement Add, via BitXor on the underlying type. --- diff --git a/src/finitenimber.rs b/src/finitenimber.rs index 1ffd3a4..9b544f6 100644 --- a/src/finitenimber.rs +++ b/src/finitenimber.rs @@ -1,7 +1,32 @@ -pub trait FiniteNimberBaseInteger : std::ops::BitXor + Sized { - type Owned; +use std::fmt::Debug; + +pub trait FiniteNimberBase : std::ops::BitXor + Clone + Eq + Debug + Sized { + type Owned: FiniteNimberBase; + + fn to_owned(self) -> Self::Owned; +} + +impl FiniteNimberBase for u64 { + type Owned = Self; + + fn to_owned(self) -> Self::Owned {self} } -pub struct FiniteNimber { +#[derive(Clone, PartialEq, Eq, Debug)] +pub struct FiniteNimber { n: T, } + +impl FiniteNimber { + pub fn new(n: T) -> Self { + Self { n } + } +} + +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()) + } +} diff --git a/src/lib.rs b/src/lib.rs index bc692dc..dcc764d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,15 @@ mod finitenimber; pub use finitenimber::FiniteNimber; + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn addition() { + let a = FiniteNimber::new(0b1100u64); + let b = FiniteNimber::new(0b1010u64); + assert_eq!(a + b, FiniteNimber::new(0b0110u64)); + } +}