[][src]Trait float_eq::FloatEqUlpsEpsilon

pub trait FloatEqUlpsEpsilon {
    type UlpsEpsilon: ?Sized;
}

Per-field thresholds for ULPs based comparisons.

This trait establishes a one-to-one relation between an IEEE floating point type and a type whose fields are expected to be structurally identical but specified in ULPs. It is used by ULPS-based equality checks to specify per-field thresholds. The UlpsEpsilon type alias exists to simplify usage, for example UlpsEpsilon<f32> is u32. Usually, this type is named FooUlps for a given type Foo.

Derivable

This trait can be used with #[derive]. The easiest way to do so is to use the #[derive_float_eq] helper macro, see the top level docs for example usage.

If you wish to derive this trait by itself, you will need to use a #[float_eq] attribute and provide ulps_epsilon, which will be used as the name of a new type. This type will be structurally identical to the type being derived, using the same visibility as the parent type and with identically named fields that use the derived fields' types wrapped by UlpsEpsilon. The new struct derives Debug, Clone, Copy and PartialEq. This trait may not be derived for enums or generic structs at present.

#[derive(Debug, Clone, Copy, PartialEq, FloatEqUlpsEpsilon)]
#[float_eq(ulps_epsilon = "PointUlps")]
struct Point {
    x: f64,
    y: f64,
}

assert_eq!(
    PointUlps { x: 1, y: 2 },
    UlpsEpsilon::<Point> { x: 1, y: 2 }
);

How can I implement FloatEqUlpsEpsilon?

Types should provide an UlpsEpsilon representation for each of their fields:

#[derive(Debug, Clone, Copy, PartialEq)]
struct Point {
    x: f64,
    y: f64,
}

#[derive(Debug, Clone, Copy, PartialEq)]
struct PointUlps {
    x: UlpsEpsilon<f64>,
    y: UlpsEpsilon<f64>,
}

impl FloatEqUlpsEpsilon for Point {
    type UlpsEpsilon = PointUlps;
}

assert_eq!(
    PointUlps { x: 1, y: 2 },
    UlpsEpsilon::<Point> { x: 1, y: 2 }
);

Associated Types

type UlpsEpsilon: ?Sized

A structurally identical type to Self, with fields recursively wrapped by UlpsEpsilon.

Loading content...

Implementations on Foreign Types

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 0] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 1] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 2] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 3] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 4] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 5] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 6] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 7] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 8] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 9] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 10] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 11] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 12] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 13] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 14] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 15] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 16] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 17] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 18] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 19] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 20] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 21] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 22] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 23] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 24] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 25] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 26] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 27] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 28] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 29] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 30] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 31] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T; 32] where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for Option<T> where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for [T] where
    UlpsEpsilon<T>: Sized
[src]

impl FloatEqUlpsEpsilon for f32[src]

impl FloatEqUlpsEpsilon for f64[src]

impl FloatEqUlpsEpsilon for ()[src]

impl<A> FloatEqUlpsEpsilon for (A,) where
    A: FloatEqUlpsEpsilon + ?Sized,
    UlpsEpsilon<A>: Sized
[src]

impl<A: FloatEqUlpsEpsilon, B> FloatEqUlpsEpsilon for (A, B) where
    B: FloatEqUlpsEpsilon + ?Sized,
    UlpsEpsilon<A>: Sized,
    UlpsEpsilon<B>: Sized
[src]

impl<A: FloatEqUlpsEpsilon, B: FloatEqUlpsEpsilon, C> FloatEqUlpsEpsilon for (A, B, C) where
    C: FloatEqUlpsEpsilon + ?Sized,
    UlpsEpsilon<A>: Sized,
    UlpsEpsilon<B>: Sized,
    UlpsEpsilon<C>: Sized
[src]

impl<A: FloatEqUlpsEpsilon, B: FloatEqUlpsEpsilon, C: FloatEqUlpsEpsilon, D> FloatEqUlpsEpsilon for (A, B, C, D) where
    D: FloatEqUlpsEpsilon + ?Sized,
    UlpsEpsilon<A>: Sized,
    UlpsEpsilon<B>: Sized,
    UlpsEpsilon<C>: Sized,
    UlpsEpsilon<D>: Sized
[src]

impl<A: FloatEqUlpsEpsilon, B: FloatEqUlpsEpsilon, C: FloatEqUlpsEpsilon, D: FloatEqUlpsEpsilon, E> FloatEqUlpsEpsilon for (A, B, C, D, E) where
    E: FloatEqUlpsEpsilon + ?Sized,
    UlpsEpsilon<A>: Sized,
    UlpsEpsilon<B>: Sized,
    UlpsEpsilon<C>: Sized,
    UlpsEpsilon<D>: Sized,
    UlpsEpsilon<E>: Sized
[src]

impl<A: FloatEqUlpsEpsilon, B: FloatEqUlpsEpsilon, C: FloatEqUlpsEpsilon, D: FloatEqUlpsEpsilon, E: FloatEqUlpsEpsilon, F> FloatEqUlpsEpsilon for (A, B, C, D, E, F) where
    F: FloatEqUlpsEpsilon + ?Sized,
    UlpsEpsilon<A>: Sized,
    UlpsEpsilon<B>: Sized,
    UlpsEpsilon<C>: Sized,
    UlpsEpsilon<D>: Sized,
    UlpsEpsilon<E>: Sized,
    UlpsEpsilon<F>: Sized
[src]

impl<A: FloatEqUlpsEpsilon, B: FloatEqUlpsEpsilon, C: FloatEqUlpsEpsilon, D: FloatEqUlpsEpsilon, E: FloatEqUlpsEpsilon, F: FloatEqUlpsEpsilon, G> FloatEqUlpsEpsilon for (A, B, C, D, E, F, G) where
    G: FloatEqUlpsEpsilon + ?Sized,
    UlpsEpsilon<A>: Sized,
    UlpsEpsilon<B>: Sized,
    UlpsEpsilon<C>: Sized,
    UlpsEpsilon<D>: Sized,
    UlpsEpsilon<E>: Sized,
    UlpsEpsilon<F>: Sized,
    UlpsEpsilon<G>: Sized
[src]

impl<A: FloatEqUlpsEpsilon, B: FloatEqUlpsEpsilon, C: FloatEqUlpsEpsilon, D: FloatEqUlpsEpsilon, E: FloatEqUlpsEpsilon, F: FloatEqUlpsEpsilon, G: FloatEqUlpsEpsilon, H> FloatEqUlpsEpsilon for (A, B, C, D, E, F, G, H) where
    H: FloatEqUlpsEpsilon + ?Sized,
    UlpsEpsilon<A>: Sized,
    UlpsEpsilon<B>: Sized,
    UlpsEpsilon<C>: Sized,
    UlpsEpsilon<D>: Sized,
    UlpsEpsilon<E>: Sized,
    UlpsEpsilon<F>: Sized,
    UlpsEpsilon<G>: Sized,
    UlpsEpsilon<H>: Sized
[src]

impl<A: FloatEqUlpsEpsilon, B: FloatEqUlpsEpsilon, C: FloatEqUlpsEpsilon, D: FloatEqUlpsEpsilon, E: FloatEqUlpsEpsilon, F: FloatEqUlpsEpsilon, G: FloatEqUlpsEpsilon, H: FloatEqUlpsEpsilon, I> FloatEqUlpsEpsilon for (A, B, C, D, E, F, G, H, I) where
    I: FloatEqUlpsEpsilon + ?Sized,
    UlpsEpsilon<A>: Sized,
    UlpsEpsilon<B>: Sized,
    UlpsEpsilon<C>: Sized,
    UlpsEpsilon<D>: Sized,
    UlpsEpsilon<E>: Sized,
    UlpsEpsilon<F>: Sized,
    UlpsEpsilon<G>: Sized,
    UlpsEpsilon<H>: Sized,
    UlpsEpsilon<I>: Sized
[src]

impl<A: FloatEqUlpsEpsilon, B: FloatEqUlpsEpsilon, C: FloatEqUlpsEpsilon, D: FloatEqUlpsEpsilon, E: FloatEqUlpsEpsilon, F: FloatEqUlpsEpsilon, G: FloatEqUlpsEpsilon, H: FloatEqUlpsEpsilon, I: FloatEqUlpsEpsilon, J> FloatEqUlpsEpsilon for (A, B, C, D, E, F, G, H, I, J) where
    J: FloatEqUlpsEpsilon + ?Sized,
    UlpsEpsilon<A>: Sized,
    UlpsEpsilon<B>: Sized,
    UlpsEpsilon<C>: Sized,
    UlpsEpsilon<D>: Sized,
    UlpsEpsilon<E>: Sized,
    UlpsEpsilon<F>: Sized,
    UlpsEpsilon<G>: Sized,
    UlpsEpsilon<H>: Sized,
    UlpsEpsilon<I>: Sized,
    UlpsEpsilon<J>: Sized
[src]

impl<A: FloatEqUlpsEpsilon, B: FloatEqUlpsEpsilon, C: FloatEqUlpsEpsilon, D: FloatEqUlpsEpsilon, E: FloatEqUlpsEpsilon, F: FloatEqUlpsEpsilon, G: FloatEqUlpsEpsilon, H: FloatEqUlpsEpsilon, I: FloatEqUlpsEpsilon, J: FloatEqUlpsEpsilon, K> FloatEqUlpsEpsilon for (A, B, C, D, E, F, G, H, I, J, K) where
    K: FloatEqUlpsEpsilon + ?Sized,
    UlpsEpsilon<A>: Sized,
    UlpsEpsilon<B>: Sized,
    UlpsEpsilon<C>: Sized,
    UlpsEpsilon<D>: Sized,
    UlpsEpsilon<E>: Sized,
    UlpsEpsilon<F>: Sized,
    UlpsEpsilon<G>: Sized,
    UlpsEpsilon<H>: Sized,
    UlpsEpsilon<I>: Sized,
    UlpsEpsilon<J>: Sized,
    UlpsEpsilon<K>: Sized
[src]

impl<A: FloatEqUlpsEpsilon, B: FloatEqUlpsEpsilon, C: FloatEqUlpsEpsilon, D: FloatEqUlpsEpsilon, E: FloatEqUlpsEpsilon, F: FloatEqUlpsEpsilon, G: FloatEqUlpsEpsilon, H: FloatEqUlpsEpsilon, I: FloatEqUlpsEpsilon, J: FloatEqUlpsEpsilon, K: FloatEqUlpsEpsilon, L> FloatEqUlpsEpsilon for (A, B, C, D, E, F, G, H, I, J, K, L) where
    L: FloatEqUlpsEpsilon + ?Sized,
    UlpsEpsilon<A>: Sized,
    UlpsEpsilon<B>: Sized,
    UlpsEpsilon<C>: Sized,
    UlpsEpsilon<D>: Sized,
    UlpsEpsilon<E>: Sized,
    UlpsEpsilon<F>: Sized,
    UlpsEpsilon<G>: Sized,
    UlpsEpsilon<H>: Sized,
    UlpsEpsilon<I>: Sized,
    UlpsEpsilon<J>: Sized,
    UlpsEpsilon<K>: Sized,
    UlpsEpsilon<L>: Sized
[src]

impl<T: ?Sized + FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for Arc<T>[src]

impl<T: ?Sized + FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for Box<T>[src]

impl<T: ?Sized + FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for Rc<T>[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for Vec<T> where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for VecDeque<T> where
    UlpsEpsilon<T>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for LinkedList<T> where
    UlpsEpsilon<T>: Sized
[src]

impl<K, V, S> FloatEqUlpsEpsilon for HashMap<K, V, S> where
    V: FloatEqUlpsEpsilon,
    UlpsEpsilon<V>: Sized
[src]

impl<K, V> FloatEqUlpsEpsilon for BTreeMap<K, V> where
    V: FloatEqUlpsEpsilon,
    UlpsEpsilon<V>: Sized
[src]

impl<T: FloatEqUlpsEpsilon> FloatEqUlpsEpsilon for Complex<T> where
    UlpsEpsilon<T>: Sized
[src]

Loading content...

Implementors

Loading content...