Skip to main content

nekolib/traits/
additive.rs

1//! 加法に関するトレイトたちです。
2//!
3//! これを実装したクラスは `OpAdd` によって和を求められます。
4//! 区間和を求めるデータ構造などに使います。
5
6use std::ops::Add;
7
8/// 加法の単位元 $0$ を定義する。
9pub trait Zero: Add<Output = Self> + Sized {
10    /// 加法の単位元 $0$ を返す。
11    fn zero() -> Self;
12}
13/// 加法が結合法則を満たすことを示す。
14///
15/// $$ x, y, z \\in S \\implies (x + y) + z = x + (y + z). $$
16pub trait AddAssoc: Add<Output = Self> + Sized {}
17/// 加法が交換法則を満たすことを示す。
18///
19/// $$ x, y \\in S \\implies x + y = y + x. $$
20pub trait AddComm: Add<Output = Self> + Sized {}
21
22macro_rules! impl_trait {
23    (
24        $( impl ($T:ty) for { $( $U:ty ),* } $S:tt )*
25    ) => {
26        $( $( impl $T for $U $S )* )*
27    };
28}
29
30impl_trait! {
31    impl (Zero) for {i8, i16, i32, i64, i128, isize, u8, u16, u32, u64, u128, usize} {
32        fn zero() -> Self { 0 }
33    }
34    impl (AddAssoc) for {i8, i16, i32, i64, i128, isize, u8, u16, u32, u64, u128, usize} {}
35    impl (AddComm) for {i8, i16, i32, i64, i128, isize, u8, u16, u32, u64, u128, usize} {}
36}