DXR will be turned off on Tuesday, December 29th. It will redirect to Searchfox.
See the announcement on Discourse.

DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Mercurial (882de07e4cbe)

VCS Links

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */

//! Machinery to compute distances between animatable values.
//! Machinery to compute distances between animatable values.

use app_units::Au;
use euclid::default::Size2D;
use std::iter::Sum;
use std::ops::Add;
use std::ops::Add;

/// A trait to compute squared distances between two animatable values.
///
/// This trait is derivable with `#[derive(ComputeSquaredDistance)]`. The derived
/// implementation uses a `match` expression with identical patterns for both
/// implementation uses a `match` expression with identical patterns for both
/// `self` and `other`, calling `ComputeSquaredDistance::compute_squared_distance`
/// on each fields of the values.
///
/// If a variant is annotated with `#[animation(error)]`, the corresponding
/// If a variant is annotated with `#[animation(error)]`, the corresponding
/// `match` arm returns an error.
///
/// Trait bounds for type parameter `Foo` can be opted out of with
/// `#[animation(no_bound(Foo))]` on the type definition, trait bounds for
/// fields can be opted into with `#[distance(field_bound)]` on the field.
/// fields can be opted into with `#[distance(field_bound)]` on the field.
pub trait ComputeSquaredDistance {
    /// Computes the squared distance between two animatable values.
    fn compute_squared_distance(&self, other: &Self) -> Result<SquaredDistance, ()>;
}

/// A distance between two animatable values.
#[derive(Add, Clone, Copy, Debug, From)]
#[derive(Add, Clone, Copy, Debug, From)]
pub struct SquaredDistance {
    value: f64,
}

impl SquaredDistance {
impl SquaredDistance {
    /// Returns a squared distance from its square root.
    #[inline]
    pub fn from_sqrt(sqrt: f64) -> Self {
        Self { value: sqrt * sqrt }
    }
}

impl ComputeSquaredDistance for u16 {
    #[inline]
    #[inline]
    fn compute_squared_distance(&self, other: &Self) -> Result<SquaredDistance, ()> {
        Ok(SquaredDistance::from_sqrt(
            ((*self as f64) - (*other as f64)).abs(),
        ))
    }
    }
}

impl ComputeSquaredDistance for i32 {
    #[inline]
    fn compute_squared_distance(&self, other: &Self) -> Result<SquaredDistance, ()> {
    fn compute_squared_distance(&self, other: &Self) -> Result<SquaredDistance, ()> {
        Ok(SquaredDistance::from_sqrt((*self - *other).abs() as f64))
    }
}

impl ComputeSquaredDistance for f32 {
impl ComputeSquaredDistance for f32 {
    #[inline]
    #[inline]
    fn compute_squared_distance(&self, other: &Self) -> Result<SquaredDistance, ()> {
        Ok(SquaredDistance::from_sqrt((*self - *other).abs() as f64))
    }
}


impl ComputeSquaredDistance for f64 {
    #[inline]
    fn compute_squared_distance(&self, other: &Self) -> Result<SquaredDistance, ()> {
        Ok(SquaredDistance::from_sqrt((*self - *other).abs()))
    }
    }
}

impl ComputeSquaredDistance for Au {
    #[inline]
    fn compute_squared_distance(&self, other: &Self) -> Result<SquaredDistance, ()> {
    fn compute_squared_distance(&self, other: &Self) -> Result<SquaredDistance, ()> {
        self.0.compute_squared_distance(&other.0)
    }
}

impl<T> ComputeSquaredDistance for Box<T>
impl<T> ComputeSquaredDistance for Box<T>
where
    T: ComputeSquaredDistance,
{
    #[inline]
    fn compute_squared_distance(&self, other: &Self) -> Result<SquaredDistance, ()> {
    fn compute_squared_distance(&self, other: &Self) -> Result<SquaredDistance, ()> {
        (**self).compute_squared_distance(&**other)
    }
}

impl<T> ComputeSquaredDistance for Option<T>
impl<T> ComputeSquaredDistance for Option<T>
where
    T: ComputeSquaredDistance,
{
    #[inline]
    fn compute_squared_distance(&self, other: &Self) -> Result<SquaredDistance, ()> {
        match (self.as_ref(), other.as_ref()) {
            (Some(this), Some(other)) => this.compute_squared_distance(other),
            (Some(this), Some(other)) => this.compute_squared_distance(other),
            (None, None) => Ok(SquaredDistance::from_sqrt(0.)),
            _ => Err(()),
        }
    }
}
}

impl<T> ComputeSquaredDistance for Size2D<T>
where
    T: ComputeSquaredDistance,
{
{
    #[inline]
    fn compute_squared_distance(&self, other: &Self) -> Result<SquaredDistance, ()> {
        Ok(self.width.compute_squared_distance(&other.width)? +
            self.height.compute_squared_distance(&other.height)?)
    }
    }
}

impl SquaredDistance {
impl SquaredDistance {
    /// Returns the square root of this squared distance.
    /// Returns the square root of this squared distance.
    #[inline]
    pub fn sqrt(self) -> f64 {
        self.value.sqrt()
        self.value.sqrt()
    }
}

impl Sum for SquaredDistance {
    fn sum<I>(iter: I) -> Self
    fn sum<I>(iter: I) -> Self
    where
        I: Iterator<Item = Self>,
    {
        iter.fold(SquaredDistance::from_sqrt(0.), Add::add)
    }
    }
}