#[derive(Debug, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)]
pub enum CalculablePropertyValue<U: Unit>
{
Constant(U),
Percentage(PercentageUnit<U::Number>),
Calc(CalcFunction<U>),
Attr(AttrFunction),
Var(VarFunction),
}
impl<U: Unit> Default for CalculablePropertyValue<U>
{
#[inline(always)]
fn default() -> Self
{
CalculablePropertyValue::Constant(U::default())
}
}
impl<U: Unit> ToCss for CalculablePropertyValue<U>
{
fn to_css<W: fmt::Write>(&self, dest: &mut W) -> fmt::Result
{
use self::CalculablePropertyValue::*;
match *self
{
Constant(ref constant) => constant.to_css(dest),
Percentage(ref percentage) => percentage.to_css(dest),
Calc(ref function) => function.to_css(dest),
Attr(ref function) => function.to_css(dest),
Var(ref function) => function.to_css(dest),
}
}
}
impl<U: Unit> Expression<U> for CalculablePropertyValue<U>
{
#[inline(always)]
fn evaluate<Conversion: FontRelativeLengthConversion<U::Number> + ViewportPercentageLengthConversion<U::Number> + PercentageConversion<U::Number> + AttributeConversion<U> + CssVariableConversion>(&self, conversion: &Conversion) -> Option<U::Number>
{
use self::CalculablePropertyValue::*;
match *self
{
Constant(ref constant) => Some(constant.to_CssNumber()),
Percentage(ref percentage) => Some(percentage.to_absolute_value(conversion)),
Calc(ref function) => function.evaluate(conversion),
Attr(ref function) => function.evaluate(conversion),
Var(ref function) => function.evaluate(conversion),
}
}
}