use crate::integer::Integer;
use crate::integer_polynomial::IntegerPolynomial;
use alloc::vec::Vec;
use malachite_base::num::basic::unsigneds::PrimitiveUnsigned;
use malachite_base::num::conversion::traits::ConvertibleFrom;
use malachite_base::polynomial::Polynomial;
use malachite_base::unsigned_polynomial::UnsignedPolynomial;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct UnsignedPolynomialFromIntegerPolynomialError;
impl<T: PrimitiveUnsigned + for<'a> TryFrom<&'a Integer>> TryFrom<&IntegerPolynomial>
for UnsignedPolynomial<T>
{
type Error = UnsignedPolynomialFromIntegerPolynomialError;
fn try_from(p: &IntegerPolynomial) -> Result<Self, Self::Error> {
Ok(Self::from_coefficients_asc(
p.coefficients
.iter()
.map(|c| T::try_from(c).map_err(|_| UnsignedPolynomialFromIntegerPolynomialError))
.collect::<Result<Vec<T>, _>>()?,
))
}
}
impl<T: PrimitiveUnsigned + for<'a> TryFrom<&'a Integer>> TryFrom<IntegerPolynomial>
for UnsignedPolynomial<T>
{
type Error = UnsignedPolynomialFromIntegerPolynomialError;
#[inline]
fn try_from(p: IntegerPolynomial) -> Result<Self, Self::Error> {
Self::try_from(&p)
}
}
impl<T: PrimitiveUnsigned + for<'a> ConvertibleFrom<&'a Integer>>
ConvertibleFrom<&IntegerPolynomial> for UnsignedPolynomial<T>
{
#[inline]
fn convertible_from(p: &IntegerPolynomial) -> bool {
p.coefficients.iter().all(|c| T::convertible_from(c))
}
}