use {
super::{CalcExpression, Expression},
crate::domain::units::{
conversions::{
AttributeConversion,
CssVariableConversion,
FontRelativeLengthConversion,
PercentageConversion,
ViewportPercentageLengthConversion,
},
Unit,
},
cssparser::ToCss,
std::{fmt, rc::Rc},
};
#[derive(Debug, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)]
pub struct CalcFunction<U: Unit>(pub Rc<CalcExpression<U>>);
impl<U: Unit> Default for CalcFunction<U> {
#[inline(always)]
fn default() -> Self {
CalcFunction(Rc::new(CalcExpression::default()))
}
}
impl<U: Unit> ToCss for CalcFunction<U> {
fn to_css<W: fmt::Write>(&self, dest: &mut W) -> fmt::Result {
dest.write_str("calc(")?;
self.0.to_css(dest)?;
dest.write_char(')')
}
}
impl<U: Unit> Expression<U> for CalcFunction<U> {
#[inline(always)]
fn evaluate<
Conversion: FontRelativeLengthConversion<U::Number>
+ ViewportPercentageLengthConversion<U::Number>
+ PercentageConversion<U::Number>
+ AttributeConversion<U>
+ CssVariableConversion,
>(
&self,
conversion: &Conversion,
) -> Option<U::Number> {
self.0.evaluate(conversion)
}
}