Skip to main content

nekolib/utils/
op_affine.rs

1//! 加法に関する wrapper クラス。
2
3use 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        // c(ax+b) + d = acx + (bc+d)
33        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}