#![allow(dead_code)]
use crate::{AbelianGroup, Associative, Commutative, Distributive, DivisionAlgebra, One, Zero};
use core::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign};
#[derive(Clone, Copy, PartialEq, Debug)]
pub struct FloatWrap(pub f64);
impl Add for FloatWrap {
type Output = Self;
fn add(self, rhs: Self) -> Self {
FloatWrap(self.0 + rhs.0)
}
}
impl AddAssign for FloatWrap {
fn add_assign(&mut self, rhs: Self) {
self.0 += rhs.0;
}
}
impl Sub for FloatWrap {
type Output = Self;
fn sub(self, rhs: Self) -> Self {
FloatWrap(self.0 - rhs.0)
}
}
impl SubAssign for FloatWrap {
fn sub_assign(&mut self, rhs: Self) {
self.0 -= rhs.0;
}
}
impl Mul for FloatWrap {
type Output = Self;
fn mul(self, rhs: Self) -> Self {
FloatWrap(self.0 * rhs.0)
}
}
impl MulAssign for FloatWrap {
fn mul_assign(&mut self, rhs: Self) {
self.0 *= rhs.0;
}
}
impl Div for FloatWrap {
type Output = Self;
fn div(self, rhs: Self) -> Self {
FloatWrap(self.0 / rhs.0)
}
}
impl DivAssign for FloatWrap {
fn div_assign(&mut self, rhs: Self) {
self.0 /= rhs.0;
}
}
impl Neg for FloatWrap {
type Output = Self;
fn neg(self) -> Self {
FloatWrap(-self.0)
}
}
impl Mul<f64> for FloatWrap {
type Output = Self;
fn mul(self, rhs: f64) -> Self {
FloatWrap(self.0 * rhs)
}
}
impl MulAssign<f64> for FloatWrap {
fn mul_assign(&mut self, rhs: f64) {
self.0 *= rhs;
}
}
impl Zero for FloatWrap {
fn zero() -> Self {
FloatWrap(0.0)
}
fn is_zero(&self) -> bool {
self.0 == 0.0
}
fn set_zero(&mut self) {
self.0 = 0.0;
}
}
impl One for FloatWrap {
fn one() -> Self {
FloatWrap(1.0)
}
fn is_one(&self) -> bool {
self.0 == 1.0
}
}
impl Associative for FloatWrap {}
impl Commutative for FloatWrap {}
impl Distributive for FloatWrap {}
impl AbelianGroup for FloatWrap {}
impl DivisionAlgebra<f64> for FloatWrap {
fn conjugate(&self) -> Self {
*self
}
fn norm_sqr(&self) -> f64 {
self.0 * self.0
}
fn inverse(&self) -> Self {
FloatWrap(1.0 / self.0)
}
}
impl From<f64> for FloatWrap {
fn from(x: f64) -> Self {
FloatWrap(x)
}
}
impl From<FloatWrap> for f64 {
fn from(w: FloatWrap) -> Self {
w.0
}
}
impl crate::iso::GroupIso<f64> for FloatWrap {}
impl crate::iso::RingIso<f64> for FloatWrap {}
impl crate::iso::FieldIso<f64> for FloatWrap {}
impl crate::iso::AlgebraIso<f64, f64> for FloatWrap {}
impl crate::iso::DivisionAlgebraIso<f64, f64> for FloatWrap {}
#[derive(Clone, Copy, PartialEq, Debug)]
pub struct BadFieldWrap(pub f64);
impl Add for BadFieldWrap {
type Output = Self;
fn add(self, rhs: Self) -> Self {
BadFieldWrap(self.0 + rhs.0)
}
}
impl AddAssign for BadFieldWrap {
fn add_assign(&mut self, rhs: Self) {
self.0 += rhs.0;
}
}
impl Sub for BadFieldWrap {
type Output = Self;
fn sub(self, rhs: Self) -> Self {
BadFieldWrap(self.0 - rhs.0)
}
}
impl SubAssign for BadFieldWrap {
fn sub_assign(&mut self, rhs: Self) {
self.0 -= rhs.0;
}
}
impl Mul for BadFieldWrap {
type Output = Self;
fn mul(self, rhs: Self) -> Self {
BadFieldWrap(self.0 * rhs.0)
}
}
impl MulAssign for BadFieldWrap {
fn mul_assign(&mut self, rhs: Self) {
self.0 *= rhs.0;
}
}
impl Div for BadFieldWrap {
type Output = Self;
fn div(self, rhs: Self) -> Self {
BadFieldWrap(self.0 / rhs.0)
}
}
impl DivAssign for BadFieldWrap {
fn div_assign(&mut self, rhs: Self) {
self.0 /= rhs.0;
}
}
impl Neg for BadFieldWrap {
type Output = Self;
fn neg(self) -> Self {
BadFieldWrap(-self.0)
}
}
impl Mul<f64> for BadFieldWrap {
type Output = Self;
fn mul(self, rhs: f64) -> Self {
BadFieldWrap(self.0 * rhs)
}
}
impl MulAssign<f64> for BadFieldWrap {
fn mul_assign(&mut self, rhs: f64) {
self.0 *= rhs;
}
}
impl Zero for BadFieldWrap {
fn zero() -> Self {
BadFieldWrap(0.0)
}
fn is_zero(&self) -> bool {
self.0 == 0.0
}
fn set_zero(&mut self) {
self.0 = 0.0;
}
}
impl One for BadFieldWrap {
fn one() -> Self {
BadFieldWrap(1.0)
}
fn is_one(&self) -> bool {
self.0 == 1.0
}
}
impl Associative for BadFieldWrap {}
impl Commutative for BadFieldWrap {}
impl Distributive for BadFieldWrap {}
impl AbelianGroup for BadFieldWrap {}
impl DivisionAlgebra<f64> for BadFieldWrap {
fn conjugate(&self) -> Self {
BadFieldWrap(-self.0)
}
fn norm_sqr(&self) -> f64 {
self.0 * self.0
}
fn inverse(&self) -> Self {
BadFieldWrap(1.0 / self.0)
}
}
impl From<f64> for BadFieldWrap {
fn from(x: f64) -> Self {
BadFieldWrap(x)
}
}
impl From<BadFieldWrap> for f64 {
fn from(w: BadFieldWrap) -> Self {
w.0 + 1.0
}
}