nekolib/utils/
op_affine.rs1use super::super::traits::additive;
4use super::super::traits::binop;
5use super::super::traits::multiplicative;
6
7use std::fmt::Debug;
8
9use additive::{AddAssoc, Zero};
10use binop::{Associative, Identity, Magma};
11use multiplicative::One;
12
13#[derive(Clone, Copy, Debug, Eq, PartialEq)]
14pub enum OpAffine<T> {
15 OpAffineV,
16 _Marker(T),
17}
18pub use OpAffine::OpAffineV;
19
20impl<T> Default for OpAffine<T> {
21 fn default() -> Self { OpAffineV }
22}
23
24use std::ops::{Add, Mul};
25
26impl<T> Magma for OpAffine<T>
27where
28 T: Add<Output = T> + Mul<Output = T> + Eq + Clone + Sized,
29{
30 type Set = (T, T);
31 fn op(&self, (x1, x0): Self::Set, (y1, y0): Self::Set) -> Self::Set {
32 let z1 = x1 * y1.clone();
34 let z0 = x0 * y1 + y0;
35 (z1, z0)
36 }
37}
38impl<T> Identity for OpAffine<T>
39where
40 T: Add<Output = T> + Mul<Output = T> + Eq + Clone + Sized + Zero + One,
41{
42 fn id(&self) -> Self::Set { (T::one(), T::zero()) }
43}
44impl<T> Associative for OpAffine<T> where
45 T: Add<Output = T> + Mul<Output = T> + Eq + Clone + Sized + AddAssoc
46{
47}