summaryrefslogtreecommitdiff
path: root/src/geom/fr.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/geom/fr.rs')
-rw-r--r--src/geom/fr.rs101
1 files changed, 101 insertions, 0 deletions
diff --git a/src/geom/fr.rs b/src/geom/fr.rs
new file mode 100644
index 00000000..974d675e
--- /dev/null
+++ b/src/geom/fr.rs
@@ -0,0 +1,101 @@
+use decorum::N64;
+
+use super::*;
+
+/// A fractional length.
+#[derive(Default, Copy, Clone, PartialEq, PartialOrd, Hash)]
+pub struct Fractional(N64);
+
+impl Fractional {
+ /// Takes up zero space: `0fr`.
+ pub fn zero() -> Self {
+ Self(N64::from(0.0))
+ }
+
+ /// Takes up as much space as all other items with this fractional size: `1fr`.
+ pub fn one() -> Self {
+ Self(N64::from(1.0))
+ }
+
+ /// Create a new fractional value.
+ pub fn new(ratio: f64) -> Self {
+ Self(N64::from(ratio))
+ }
+
+ /// Get the underlying ratio.
+ pub fn get(self) -> f64 {
+ self.0.into()
+ }
+
+ /// Whether the ratio is zero.
+ pub fn is_zero(self) -> bool {
+ self.0 == 0.0
+ }
+}
+
+impl Display for Fractional {
+ fn fmt(&self, f: &mut Formatter) -> fmt::Result {
+ write!(f, "{}fr", self.get())
+ }
+}
+
+impl Debug for Fractional {
+ fn fmt(&self, f: &mut Formatter) -> fmt::Result {
+ Display::fmt(self, f)
+ }
+}
+
+impl Neg for Fractional {
+ type Output = Self;
+
+ fn neg(self) -> Self {
+ Self(-self.0)
+ }
+}
+
+impl Add for Fractional {
+ type Output = Self;
+
+ fn add(self, other: Self) -> Self {
+ Self(self.0 + other.0)
+ }
+}
+
+sub_impl!(Fractional - Fractional -> Fractional);
+
+impl Mul<f64> for Fractional {
+ type Output = Self;
+
+ fn mul(self, other: f64) -> Self {
+ Self(self.0 * other)
+ }
+}
+
+impl Mul<Fractional> for f64 {
+ type Output = Fractional;
+
+ fn mul(self, other: Fractional) -> Fractional {
+ other * self
+ }
+}
+
+impl Div<f64> for Fractional {
+ type Output = Self;
+
+ fn div(self, other: f64) -> Self {
+ Self(self.0 / other)
+ }
+}
+
+impl Div for Fractional {
+ type Output = f64;
+
+ fn div(self, other: Self) -> f64 {
+ self.get() / other.get()
+ }
+}
+
+assign_impl!(Fractional += Fractional);
+assign_impl!(Fractional -= Fractional);
+assign_impl!(Fractional *= f64);
+assign_impl!(Fractional /= f64);