use crate::scalar::{
Adele, Fp, Fpn, Gauss, Integer, Laurent, Nimber, Omnific, Poly, Qp, Qq, Ramified, Rational,
RationalFunction, Scalar, Surcomplex, Surreal, Valued, WittVec, Zp,
};
pub trait ExactScalar: Scalar {}
pub trait ExactFieldScalar: ExactScalar {}
pub trait PrecisionScalar: Scalar {}
impl ExactScalar for Integer {}
impl ExactScalar for Rational {}
impl ExactFieldScalar for Rational {}
impl ExactScalar for Surreal {}
impl ExactScalar for Omnific {}
impl ExactScalar for Nimber {}
impl ExactFieldScalar for Nimber {}
impl<const P: u128> ExactScalar for Fp<P> {}
impl<const P: u128> ExactFieldScalar for Fp<P> {}
impl<const P: u128, const N: usize> ExactScalar for Fpn<P, N> {}
impl<const P: u128, const N: usize> ExactFieldScalar for Fpn<P, N> {}
impl<const P: u128, const K: u128> ExactScalar for Zp<P, K> {}
impl<const P: u128, const N: usize, const F: usize> ExactScalar for WittVec<P, N, F> {}
impl<S: ExactScalar> ExactScalar for Surcomplex<S> {}
impl<S: ExactScalar> ExactScalar for Poly<S> {}
impl<S: ExactFieldScalar> ExactScalar for RationalFunction<S> {}
impl<S: ExactFieldScalar> ExactFieldScalar for RationalFunction<S> {}
impl<const P: u128, const K: u128> PrecisionScalar for Qp<P, K> {}
impl<const P: u128, const N: usize, const F: usize> PrecisionScalar for Qq<P, N, F> {}
impl<S: Scalar, const K: usize> PrecisionScalar for Laurent<S, K> {}
impl<S: PrecisionScalar + Valued, const E: usize> PrecisionScalar for Ramified<S, E> {}
impl<S: PrecisionScalar + Valued> PrecisionScalar for Gauss<S> {}
impl PrecisionScalar for Adele {}
#[cfg(test)]
mod tests {
use super::*;
use crate::scalar::{Fp, Laurent, Qp, Rational};
fn assert_exact<S: ExactScalar>() {}
fn assert_exact_field<S: ExactFieldScalar>() {}
fn assert_precision<S: PrecisionScalar>() {}
#[test]
fn marker_traits_cover_the_table() {
assert_exact::<Integer>();
assert_exact::<Rational>();
assert_exact_field::<Rational>();
assert_exact::<Surreal>();
assert_exact::<Omnific>();
assert_exact::<Nimber>();
assert_exact_field::<Nimber>();
assert_exact::<Fp<7>>();
assert_exact_field::<Fp<7>>();
assert_exact::<Fpn<3, 2>>();
assert_exact_field::<Fpn<3, 2>>();
assert_exact::<Zp<5, 4>>();
assert_exact::<WittVec<3, 3, 2>>();
assert_exact::<Surcomplex<Surreal>>();
assert_exact::<Poly<Rational>>();
assert_exact::<RationalFunction<Fp<7>>>();
assert_exact_field::<RationalFunction<Fp<7>>>();
assert_precision::<Qp<5, 4>>();
assert_precision::<Qq<3, 3, 2>>();
assert_precision::<Laurent<Fp<5>, 6>>();
assert_precision::<Ramified<Qp<3, 6>, 2>>();
assert_precision::<Gauss<Qp<3, 6>>>();
assert_precision::<Gauss<Laurent<Fp<5>, 6>>>();
assert_precision::<Adele>();
}
}