use crate::operations::{
AssociativeAddition, AssociativeMultiplication, CommutativeAddition, CommutativeMultiplication,
Distributive,
};
macro_rules! impl_algebraic_markers_for_primitive {
($t:ty) => {
impl CommutativeAddition for $t {}
impl AssociativeAddition for $t {}
impl AssociativeMultiplication for $t {}
impl CommutativeMultiplication for $t {}
impl Distributive for $t {}
};
}
impl_algebraic_markers_for_primitive!(i8);
impl_algebraic_markers_for_primitive!(i16);
impl_algebraic_markers_for_primitive!(i32);
impl_algebraic_markers_for_primitive!(i64);
impl_algebraic_markers_for_primitive!(i128);
impl_algebraic_markers_for_primitive!(isize);
impl_algebraic_markers_for_primitive!(u8);
impl_algebraic_markers_for_primitive!(u16);
impl_algebraic_markers_for_primitive!(u32);
impl_algebraic_markers_for_primitive!(u64);
impl_algebraic_markers_for_primitive!(u128);
impl_algebraic_markers_for_primitive!(usize);
impl_algebraic_markers_for_primitive!(f32);
impl_algebraic_markers_for_primitive!(f64);
#[cfg(test)]
mod tests {
use crate::fields::{EuclideanDomain, Field};
use crate::groups::{
AdditiveAbelianGroup, AdditiveGroup, AdditiveMagma, AdditiveMonoid, AdditiveSemigroup,
};
use crate::groups::{
MultiplicativeAbelianGroup, MultiplicativeGroup, MultiplicativeMagma, MultiplicativeMonoid,
MultiplicativeSemigroup,
};
use crate::rings::{
CommutativeRing, IntegralDomain, PrincipalIdealDomain, Ring, UniqueFactorizationDomain,
};
fn assert_additive_magma<T: AdditiveMagma>() {}
fn assert_additive_semigroup<T: AdditiveSemigroup>() {}
fn assert_additive_monoid<T: AdditiveMonoid>() {}
fn assert_additive_group<T: AdditiveGroup>() {}
fn assert_additive_abelian_group<T: AdditiveAbelianGroup>() {}
fn assert_multiplicative_magma<T: MultiplicativeMagma>() {}
fn assert_multiplicative_semigroup<T: MultiplicativeSemigroup>() {}
fn assert_multiplicative_monoid<T: MultiplicativeMonoid>() {}
fn assert_multiplicative_group<T: MultiplicativeGroup>() {}
fn assert_multiplicative_abelian_group<T: MultiplicativeAbelianGroup>() {}
fn assert_ring<T: Ring>() {}
fn assert_commutative_ring<T: CommutativeRing>() {}
fn assert_integral_domain<T: IntegralDomain>() {}
fn assert_ufd<T: UniqueFactorizationDomain>() {}
fn assert_pid<T: PrincipalIdealDomain>() {}
fn assert_euclidean_domain<T: EuclideanDomain>() {}
fn assert_field<T: Field>() {}
#[test]
fn test_signed_integers() {
assert_additive_magma::<i8>();
assert_additive_semigroup::<i8>();
assert_additive_monoid::<i8>();
assert_additive_group::<i8>();
assert_additive_abelian_group::<i8>();
assert_multiplicative_magma::<i8>();
assert_multiplicative_semigroup::<i8>();
assert_multiplicative_monoid::<i8>();
assert_ring::<i8>();
assert_commutative_ring::<i8>();
assert_integral_domain::<i8>();
assert_ufd::<i8>();
assert_pid::<i8>();
assert_euclidean_domain::<i8>();
assert_additive_abelian_group::<i16>();
assert_multiplicative_monoid::<i16>();
assert_ring::<i16>();
assert_commutative_ring::<i16>();
assert_integral_domain::<i16>();
assert_ufd::<i16>();
assert_pid::<i16>();
assert_euclidean_domain::<i16>();
assert_additive_abelian_group::<i32>();
assert_multiplicative_monoid::<i32>();
assert_ring::<i32>();
assert_commutative_ring::<i32>();
assert_integral_domain::<i32>();
assert_ufd::<i32>();
assert_pid::<i32>();
assert_euclidean_domain::<i32>();
assert_additive_abelian_group::<i64>();
assert_multiplicative_monoid::<i64>();
assert_ring::<i64>();
assert_commutative_ring::<i64>();
assert_integral_domain::<i64>();
assert_ufd::<i64>();
assert_pid::<i64>();
assert_euclidean_domain::<i64>();
assert_additive_abelian_group::<i128>();
assert_multiplicative_monoid::<i128>();
assert_ring::<i128>();
assert_commutative_ring::<i128>();
assert_integral_domain::<i128>();
assert_ufd::<i128>();
assert_pid::<i128>();
assert_euclidean_domain::<i128>();
assert_additive_abelian_group::<isize>();
assert_multiplicative_monoid::<isize>();
assert_ring::<isize>();
assert_commutative_ring::<isize>();
assert_integral_domain::<isize>();
assert_ufd::<isize>();
assert_pid::<isize>();
assert_euclidean_domain::<isize>();
}
#[test]
fn test_unsigned_integers() {
assert_additive_magma::<u8>();
assert_additive_semigroup::<u8>();
assert_additive_monoid::<u8>();
assert_multiplicative_magma::<u8>();
assert_multiplicative_semigroup::<u8>();
assert_multiplicative_monoid::<u8>();
assert_additive_monoid::<u16>();
assert_multiplicative_monoid::<u16>();
assert_additive_monoid::<u32>();
assert_multiplicative_monoid::<u32>();
assert_additive_monoid::<u64>();
assert_multiplicative_monoid::<u64>();
assert_additive_monoid::<u128>();
assert_multiplicative_monoid::<u128>();
assert_additive_monoid::<usize>();
assert_multiplicative_monoid::<usize>();
}
#[test]
fn test_floating_point() {
assert_additive_magma::<f32>();
assert_additive_semigroup::<f32>();
assert_additive_monoid::<f32>();
assert_additive_group::<f32>();
assert_additive_abelian_group::<f32>();
assert_multiplicative_magma::<f32>();
assert_multiplicative_semigroup::<f32>();
assert_multiplicative_monoid::<f32>();
assert_multiplicative_group::<f32>();
assert_multiplicative_abelian_group::<f32>();
assert_ring::<f32>();
assert_commutative_ring::<f32>();
assert_integral_domain::<f32>();
assert_ufd::<f32>();
assert_pid::<f32>();
assert_euclidean_domain::<f32>();
assert_field::<f32>();
assert_additive_magma::<f64>();
assert_additive_semigroup::<f64>();
assert_additive_monoid::<f64>();
assert_additive_group::<f64>();
assert_additive_abelian_group::<f64>();
assert_multiplicative_magma::<f64>();
assert_multiplicative_semigroup::<f64>();
assert_multiplicative_monoid::<f64>();
assert_multiplicative_group::<f64>();
assert_multiplicative_abelian_group::<f64>();
assert_ring::<f64>();
assert_commutative_ring::<f64>();
assert_integral_domain::<f64>();
assert_ufd::<f64>();
assert_pid::<f64>();
assert_euclidean_domain::<f64>();
assert_field::<f64>();
}
#[test]
fn test_basic_operations() {
let a: i32 = 5;
let b: i32 = 3;
assert_eq!(a + b, 8);
assert_eq!(a - b, 2);
assert_eq!(a * b, 15);
assert_eq!(a / b, 1);
let c: f64 = 5.0;
let d: f64 = 2.0;
assert_eq!(c + d, 7.0);
assert_eq!(c - d, 3.0);
assert_eq!(c * d, 10.0);
assert_eq!(c / d, 2.5);
}
}