pub trait CssNumber: Sized
+ Copy + Clone
+ PartialEq<Self> + Eq + PartialOrd + Ord + Hash
+ ToCss
+ Default
+ Add<Self, Output=Self> + AddAssign<Self>
+ Sub<Self, Output=Self> + SubAssign<Self>
+ Mul<Self, Output=Self> + MulAssign<Self>
+ Div<Self, Output=Self> + DivAssign<Self>
+ Rem<Self, Output=Self> + RemAssign<Self>
+ Neg<Output=Self>
+ Debug + Display
+ Deref
+ From<u16> + From<u8>
+ CssNumberNewType<Self> + Unit<Number=Self> + AppUnitsPer
{
const Zero: Self;
const One: Self;
const Maximum: Self;
const Minimum: Self;
const DotsPerInch: Self;
const CentimetresPerInch: Self;
#[inline(always)]
fn new(value: f32) -> Result<Self, CssNumberConversionError>
{
const NegativeZero: f32 = -0.0_f32;
const PositiveZero: f32 = 0.0_f32;
use self::CssNumberConversionError::*;
if value.is_finite()
{
if value == NegativeZero
{
if Self::can_be_negative()
{
Ok(Self::_construct(PositiveZero))
}
else
{
Err(NegativeNumberMayNotBeAllowed)
}
}
else
{
Ok(Self::_construct(value))
}
}
else if !Self::can_be_negative() && value.is_sign_negative()
{
Err(NegativeNumberMayNotBeAllowed)
}
else if value.is_infinite()
{
Err(InfinityIsNotAllowed)
}
else if value.is_nan()
{
Err(NotANumberIsNotAllowed)
}
else
{
unreachable!("What other kind of f32 is there?");
}
}
#[inline(always)]
fn as_f32(&self) -> f32;
#[inline(always)]
fn as_u32(&self) -> u32;
#[inline(always)]
fn round(self) -> Self
{
Self::_construct(self.to_f32().round())
}
#[inline(always)]
fn abs(self) -> Self
{
Self::_construct(self.to_f32().abs())
}
#[inline(always)]
fn clamp(value: f32) -> Self
{
if value.is_infinite()
{
if value.is_sign_positive()
{
Self::Maximum
}
else
{
Self::Minimum
}
}
else if value.is_sign_negative() && !Self::can_be_negative()
{
Self::Zero
}
else
{
Self::_construct(value)
}
}
#[inline(always)]
fn can_be_negative() -> bool
{
Self::Minimum.is_negative()
}
#[doc(hidden)]
#[inline(always)]
fn _construct(value: f32) -> Self;
#[inline(always)]
fn parseNumber<'i>(value: f32, _int_value: Option<i32>) -> Result<Self, ParseError<'i, CustomParseError<'i>>>;
}