diff options
| author | Laurenz <laurmaedje@gmail.com> | 2021-06-09 14:05:57 +0200 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2021-06-09 22:44:40 +0200 |
| commit | bce553a991f19b2b5bb9efef6b74bd12e15a10c6 (patch) | |
| tree | fa8ed4b3974927b30e6cffd0d71d4c3e980698de /src/eval | |
| parent | 29cfef0a6dfef5820bda339d327638e285aaf4d3 (diff) | |
Tidy up
Diffstat (limited to 'src/eval')
| -rw-r--r-- | src/eval/mod.rs | 3 | ||||
| -rw-r--r-- | src/eval/ops.rs | 58 | ||||
| -rw-r--r-- | src/eval/value.rs | 32 |
3 files changed, 53 insertions, 40 deletions
diff --git a/src/eval/mod.rs b/src/eval/mod.rs index 80be2e82..4b5feb0d 100644 --- a/src/eval/mod.rs +++ b/src/eval/mod.rs @@ -18,7 +18,6 @@ use std::rc::Rc; use crate::cache::Cache; use crate::color::Color; use crate::diag::{Diag, DiagSet, Pass}; -use crate::geom::TrackSizing; use crate::geom::{Angle, Fractional, Length, Relative}; use crate::loading::{FileHash, Loader}; use crate::parse::parse; @@ -245,6 +244,7 @@ impl Eval for Expr { fn eval(&self, ctx: &mut EvalContext) -> Self::Output { match *self { Self::None(_) => Value::None, + Self::Auto(_) => Value::Auto, Self::Bool(_, v) => Value::Bool(v), Self::Int(_, v) => Value::Int(v), Self::Float(_, v) => Value::Float(v), @@ -252,7 +252,6 @@ impl Eval for Expr { Self::Angle(_, v, unit) => Value::Angle(Angle::with_unit(v, unit)), Self::Percent(_, v) => Value::Relative(Relative::new(v / 100.0)), Self::Fractional(_, v) => Value::Fractional(Fractional::new(v)), - Self::Auto(_) => Value::TrackSizing(TrackSizing::Auto), Self::Color(_, v) => Value::Color(Color::Rgba(v)), Self::Str(_, ref v) => Value::Str(v.clone()), Self::Ident(ref v) => match ctx.scopes.get(&v) { diff --git a/src/eval/ops.rs b/src/eval/ops.rs index 15c09e03..b6bd5402 100644 --- a/src/eval/ops.rs +++ b/src/eval/ops.rs @@ -11,8 +11,8 @@ pub fn pos(value: Value) -> Value { Length(v) => Length(v), Angle(v) => Angle(v), Relative(v) => Relative(v), - Fractional(v) => Fractional(v), Linear(v) => Linear(v), + Fractional(v) => Fractional(v), _ => Error, } } @@ -25,8 +25,8 @@ pub fn neg(value: Value) -> Value { Length(v) => Length(-v), Angle(v) => Angle(-v), Relative(v) => Relative(-v), - Fractional(v) => Fractional(-v), Linear(v) => Linear(-v), + Fractional(v) => Fractional(-v), _ => Error, } } @@ -34,29 +34,31 @@ pub fn neg(value: Value) -> Value { /// Compute the sum of two values. pub fn add(lhs: Value, rhs: Value) -> Value { match (lhs, rhs) { - // Math. (Int(a), Int(b)) => Int(a + b), (Int(a), Float(b)) => Float(a as f64 + b), (Float(a), Int(b)) => Float(a + b as f64), (Float(a), Float(b)) => Float(a + b), + (Angle(a), Angle(b)) => Angle(a + b), + (Length(a), Length(b)) => Length(a + b), (Length(a), Relative(b)) => Linear(a + b), (Length(a), Linear(b)) => Linear(a + b), + (Relative(a), Length(b)) => Linear(a + b), (Relative(a), Relative(b)) => Relative(a + b), (Relative(a), Linear(b)) => Linear(a + b), - (Fractional(a), Fractional(b)) => Fractional(a + b), + (Linear(a), Length(b)) => Linear(a + b), (Linear(a), Relative(b)) => Linear(a + b), (Linear(a), Linear(b)) => Linear(a + b), - // Collections. + (Fractional(a), Fractional(b)) => Fractional(a + b), + (Str(a), Str(b)) => Str(a + &b), (Array(a), Array(b)) => Array(concat(a, b)), (Dict(a), Dict(b)) => Dict(concat(a, b)), - // Templates. (Template(a), Template(b)) => Template(concat(a, b)), (Template(a), None) => Template(a), (None, Template(b)) => Template(b), @@ -80,17 +82,23 @@ pub fn sub(lhs: Value, rhs: Value) -> Value { (Int(a), Float(b)) => Float(a as f64 - b), (Float(a), Int(b)) => Float(a - b as f64), (Float(a), Float(b)) => Float(a - b), + (Angle(a), Angle(b)) => Angle(a - b), + (Length(a), Length(b)) => Length(a - b), (Length(a), Relative(b)) => Linear(a - b), (Length(a), Linear(b)) => Linear(a - b), + (Relative(a), Length(b)) => Linear(a - b), (Relative(a), Relative(b)) => Relative(a - b), (Relative(a), Linear(b)) => Linear(a - b), - (Fractional(a), Fractional(b)) => Fractional(a - b), + (Linear(a), Length(b)) => Linear(a - b), (Linear(a), Relative(b)) => Linear(a - b), (Linear(a), Linear(b)) => Linear(a - b), + + (Fractional(a), Fractional(b)) => Fractional(a - b), + _ => Error, } } @@ -102,27 +110,37 @@ pub fn mul(lhs: Value, rhs: Value) -> Value { (Int(a), Float(b)) => Float(a as f64 * b), (Float(a), Int(b)) => Float(a * b as f64), (Float(a), Float(b)) => Float(a * b), + (Length(a), Int(b)) => Length(a * b as f64), (Length(a), Float(b)) => Length(a * b), (Int(a), Length(b)) => Length(a as f64 * b), (Float(a), Length(b)) => Length(a * b), + (Angle(a), Int(b)) => Angle(a * b as f64), (Angle(a), Float(b)) => Angle(a * b), (Int(a), Angle(b)) => Angle(a as f64 * b), (Float(a), Angle(b)) => Angle(a * b), + (Relative(a), Int(b)) => Relative(a * b as f64), (Relative(a), Float(b)) => Relative(a * b), - (Fractional(a), Fractional(b)) => Fractional(a * b.get()), - (Fractional(a), Int(b)) => Fractional(a * b as f64), - (Fractional(a), Float(b)) => Fractional(a * b), - (Int(a), Relative(b)) => Relative(a as f64 * b), - (Int(a), Fractional(b)) => Fractional(a as f64 * b), (Float(a), Relative(b)) => Relative(a * b), - (Float(a), Fractional(b)) => Fractional(a * b), + (Int(a), Relative(b)) => Relative(a as f64 * b), + (Linear(a), Int(b)) => Linear(a * b as f64), (Linear(a), Float(b)) => Linear(a * b), (Int(a), Linear(b)) => Linear(a as f64 * b), (Float(a), Linear(b)) => Linear(a * b), + + (Float(a), Fractional(b)) => Fractional(a * b), + (Fractional(a), Int(b)) => Fractional(a * b as f64), + (Fractional(a), Float(b)) => Fractional(a * b), + (Int(a), Fractional(b)) => Fractional(a as f64 * b), + + (Str(a), Int(b)) => Str(a.repeat(b.max(0) as usize)), + (Int(a), Str(b)) => Str(b.repeat(a.max(0) as usize)), + (Array(a), Int(b)) => Array(repeat(a, b.max(0) as usize)), + (Int(a), Array(b)) => Array(repeat(b, a.max(0) as usize)), + _ => Error, } } @@ -134,20 +152,26 @@ pub fn div(lhs: Value, rhs: Value) -> Value { (Int(a), Float(b)) => Float(a as f64 / b), (Float(a), Int(b)) => Float(a / b as f64), (Float(a), Float(b)) => Float(a / b), + (Length(a), Int(b)) => Length(a / b as f64), (Length(a), Float(b)) => Length(a / b), (Length(a), Length(b)) => Float(a / b), + (Angle(a), Int(b)) => Angle(a / b as f64), (Angle(a), Float(b)) => Angle(a / b), (Angle(a), Angle(b)) => Float(a / b), + (Relative(a), Int(b)) => Relative(a / b as f64), (Relative(a), Float(b)) => Relative(a / b), (Relative(a), Relative(b)) => Float(a / b), - (Fractional(a), Fractional(b)) => Float(a.get() / b.get()), + (Fractional(a), Int(b)) => Fractional(a / b as f64), (Fractional(a), Float(b)) => Fractional(a / b), + (Fractional(a), Fractional(b)) => Float(a / b), + (Linear(a), Int(b)) => Linear(a / b as f64), (Linear(a), Float(b)) => Linear(a / b), + _ => Error, } } @@ -209,3 +233,9 @@ where a.extend(b); a } + +/// Repeat a vector `n` times. +fn repeat<T: Clone>(vec: Vec<T>, n: usize) -> Vec<T> { + let len = n * vec.len(); + vec.into_iter().cycle().take(len).collect() +} diff --git a/src/eval/value.rs b/src/eval/value.rs index fa7993ed..51e45190 100644 --- a/src/eval/value.rs +++ b/src/eval/value.rs @@ -8,7 +8,7 @@ use std::rc::Rc; use super::EvalContext; use crate::color::{Color, RgbaColor}; use crate::exec::ExecContext; -use crate::geom::{Angle, Fractional, Length, Linear, Relative, TrackSizing}; +use crate::geom::{Angle, Fractional, Length, Linear, Relative}; use crate::syntax::{Expr, Span, Spanned, Tree}; /// A computational value. @@ -16,6 +16,8 @@ use crate::syntax::{Expr, Span, Spanned, Tree}; pub enum Value { /// The value that indicates the absence of a meaningful value. None, + /// A value that indicates some smart default behaviour. + Auto, /// A boolean: `true, false`. Bool(bool), /// An integer: `120`. @@ -28,12 +30,10 @@ pub enum Value { Angle(Angle), /// A relative value: `50%`. Relative(Relative), - /// A fractional value: `1fr`. - Fractional(Fractional), /// A combination of an absolute length and a relative value: `20% + 5cm`. Linear(Linear), - /// One of the units that can appear in a grid definition. - TrackSizing(TrackSizing), + /// A fractional value: `1fr`. + Fractional(Fractional), /// A color value: `#f79143ff`. Color(Color), /// A string: `"string"`. @@ -73,15 +73,15 @@ impl Value { pub fn type_name(&self) -> &'static str { match self { Self::None => "none", + Self::Auto => "auto", Self::Bool(_) => bool::TYPE_NAME, Self::Int(_) => i64::TYPE_NAME, Self::Float(_) => f64::TYPE_NAME, Self::Length(_) => Length::TYPE_NAME, Self::Angle(_) => Angle::TYPE_NAME, Self::Relative(_) => Relative::TYPE_NAME, - Self::Fractional(_) => Fractional::TYPE_NAME, Self::Linear(_) => Linear::TYPE_NAME, - Self::TrackSizing(_) => TrackSizing::TYPE_NAME, + Self::Fractional(_) => Fractional::TYPE_NAME, Self::Color(_) => Color::TYPE_NAME, Self::Str(_) => String::TYPE_NAME, Self::Array(_) => ArrayValue::TYPE_NAME, @@ -100,14 +100,6 @@ impl Value { (&Self::Float(a), &Self::Int(b)) => a == b as f64, (&Self::Length(a), &Self::Linear(b)) => a == b.abs && b.rel.is_zero(), (&Self::Relative(a), &Self::Linear(b)) => a == b.rel && b.abs.is_zero(), - (&Self::Length(a), &Self::TrackSizing(b)) => TrackSizing::from(a) == b, - (&Self::Relative(a), &Self::TrackSizing(b)) => TrackSizing::from(a) == b, - (&Self::Linear(a), &Self::TrackSizing(b)) => TrackSizing::from(a) == b, - (&Self::Fractional(a), &Self::TrackSizing(b)) => TrackSizing::from(a) == b, - (&Self::TrackSizing(a), &Self::Length(b)) => TrackSizing::from(b) == a, - (&Self::TrackSizing(a), &Self::Relative(b)) => TrackSizing::from(b) == a, - (&Self::TrackSizing(a), &Self::Linear(b)) => TrackSizing::from(b) == a, - (&Self::TrackSizing(a), &Self::Fractional(b)) => TrackSizing::from(b) == a, (&Self::Linear(a), &Self::Length(b)) => a.abs == b && a.rel.is_zero(), (&Self::Linear(a), &Self::Relative(b)) => a.rel == b && a.abs.is_zero(), (Self::Array(a), Self::Array(b)) => { @@ -615,21 +607,13 @@ primitive! { primitive! { Length: "length", Value::Length } primitive! { Angle: "angle", Value::Angle } primitive! { Relative: "relative", Value::Relative } -primitive! { Fractional: "fractional", Value::Fractional } primitive! { Linear: "linear", Value::Linear, Value::Length(v) => v.into(), Value::Relative(v) => v.into(), } -primitive! { - TrackSizing: "GridUnit", - Value::TrackSizing, - Value::Length(v) => v.into(), - Value::Relative(v) => v.into(), - Value::Linear(v) => v.into(), - Value::Fractional(v) => v.into(), -} +primitive! { Fractional: "fractional", Value::Fractional } primitive! { Color: "color", Value::Color } primitive! { String: "string", Value::Str } primitive! { ArrayValue: "array", Value::Array } |
