Trait PerThing

Source
pub trait PerThing:
    Sized
    + Saturating
    + Copy
    + Default
    + Eq
    + PartialEq
    + Ord
    + PartialOrd
    + Bounded
    + Debug {
    type Inner: BaseArithmetic + Unsigned + Copy + Into<u128> + Debug;
    type Upper: BaseArithmetic + Copy + From<Self::Inner> + TryInto<Self::Inner> + UniqueSaturatedInto<Self::Inner> + Unsigned + Debug;

    const ACCURACY: Self::Inner;
Show 15 methods // Required methods fn deconstruct(self) -> Self::Inner; fn from_parts(parts: Self::Inner) -> Self; fn from_fraction(x: f64) -> Self; fn from_rational_approximation<N>(p: N, q: N) -> Self where N: Clone + Ord + TryInto<Self::Inner> + TryInto<Self::Upper> + Div<Output = N> + Rem<Output = N> + Add<Output = N> + Unsigned, Self::Inner: Into<N>; // Provided methods fn zero() -> Self { ... } fn is_zero(&self) -> bool { ... } fn one() -> Self { ... } fn is_one(&self) -> bool { ... } fn from_percent(x: Self::Inner) -> Self { ... } fn square(self) -> Self { ... } fn mul_floor<N>(self, b: N) -> N where N: Clone + UniqueSaturatedInto<Self::Inner> + Rem<Output = N> + Div<Output = N> + Mul<Output = N> + Add<Output = N> + Unsigned, Self::Inner: Into<N> { ... } fn mul_ceil<N>(self, b: N) -> N where N: Clone + UniqueSaturatedInto<Self::Inner> + Rem<Output = N> + Div<Output = N> + Mul<Output = N> + Add<Output = N> + Unsigned, Self::Inner: Into<N> { ... } fn saturating_reciprocal_mul<N>(self, b: N) -> N where N: Clone + UniqueSaturatedInto<Self::Inner> + Rem<Output = N> + Div<Output = N> + Mul<Output = N> + Add<Output = N> + Saturating + Unsigned, Self::Inner: Into<N> { ... } fn saturating_reciprocal_mul_floor<N>(self, b: N) -> N where N: Clone + UniqueSaturatedInto<Self::Inner> + Rem<Output = N> + Div<Output = N> + Mul<Output = N> + Add<Output = N> + Saturating + Unsigned, Self::Inner: Into<N> { ... } fn saturating_reciprocal_mul_ceil<N>(self, b: N) -> N where N: Clone + UniqueSaturatedInto<Self::Inner> + Rem<Output = N> + Div<Output = N> + Mul<Output = N> + Add<Output = N> + Saturating + Unsigned, Self::Inner: Into<N> { ... }
}
Expand description

Re-export top-level arithmetic stuff. Something that implements a fixed point ration with an arbitrary granularity X, as parts per X.

Required Associated Constants§

Source

const ACCURACY: Self::Inner

The accuracy of this type.

Required Associated Types§

Source

type Inner: BaseArithmetic + Unsigned + Copy + Into<u128> + Debug

The data type used to build this per-thingy.

Source

type Upper: BaseArithmetic + Copy + From<Self::Inner> + TryInto<Self::Inner> + UniqueSaturatedInto<Self::Inner> + Unsigned + Debug

A data type larger than Self::Inner, used to avoid overflow in some computations. It must be able to compute ACCURACY^2.

Required Methods§

Source

fn deconstruct(self) -> Self::Inner

Consume self and return the number of parts per thing.

Source

fn from_parts(parts: Self::Inner) -> Self

Build this type from a number of parts per thing.

Source

fn from_fraction(x: f64) -> Self

Converts a fraction into Self.

Source

fn from_rational_approximation<N>(p: N, q: N) -> Self
where N: Clone + Ord + TryInto<Self::Inner> + TryInto<Self::Upper> + Div<Output = N> + Rem<Output = N> + Add<Output = N> + Unsigned, Self::Inner: Into<N>,

Approximate the fraction p/q into a per-thing fraction. This will never overflow.

The computation of this approximation is performed in the generic type N. Given M as the data type that can hold the maximum value of this per-thing (e.g. u32 for perbill), this can only work if N == M or N: From<M> + TryInto<M>.

Note that this always rounds down, i.e.

// 989/100 is technically closer to 99%.
assert_eq!(
		Percent::from_rational_approximation(989u64, 1000),
		Percent::from_parts(98),
	);

Provided Methods§

Source

fn zero() -> Self

Equivalent to Self::from_parts(0).

Source

fn is_zero(&self) -> bool

Return true if this is nothing.

Source

fn one() -> Self

Equivalent to Self::from_parts(Self::ACCURACY).

Source

fn is_one(&self) -> bool

Return true if this is one.

Source

fn from_percent(x: Self::Inner) -> Self

Build this type from a percent. Equivalent to Self::from_parts(x * Self::ACCURACY / 100) but more accurate and can cope with potential type overflows.

Source

fn square(self) -> Self

Return the product of multiplication of this value by itself.

Source

fn mul_floor<N>(self, b: N) -> N
where N: Clone + UniqueSaturatedInto<Self::Inner> + Rem<Output = N> + Div<Output = N> + Mul<Output = N> + Add<Output = N> + Unsigned, Self::Inner: Into<N>,

Multiplication that always rounds down to a whole number. The standard Mul rounds to the nearest whole number.

// round to nearest
assert_eq!(Percent::from_percent(34) * 10u64, 3);
assert_eq!(Percent::from_percent(36) * 10u64, 4);

// round down
assert_eq!(Percent::from_percent(34).mul_floor(10u64), 3);
assert_eq!(Percent::from_percent(36).mul_floor(10u64), 3);
Source

fn mul_ceil<N>(self, b: N) -> N
where N: Clone + UniqueSaturatedInto<Self::Inner> + Rem<Output = N> + Div<Output = N> + Mul<Output = N> + Add<Output = N> + Unsigned, Self::Inner: Into<N>,

Multiplication that always rounds the result up to a whole number. The standard Mul rounds to the nearest whole number.

// round to nearest
assert_eq!(Percent::from_percent(34) * 10u64, 3);
assert_eq!(Percent::from_percent(36) * 10u64, 4);

// round up
assert_eq!(Percent::from_percent(34).mul_ceil(10u64), 4);
assert_eq!(Percent::from_percent(36).mul_ceil(10u64), 4);
Source

fn saturating_reciprocal_mul<N>(self, b: N) -> N
where N: Clone + UniqueSaturatedInto<Self::Inner> + Rem<Output = N> + Div<Output = N> + Mul<Output = N> + Add<Output = N> + Saturating + Unsigned, Self::Inner: Into<N>,

Saturating multiplication by the reciprocal of self. The result is rounded to the nearest whole number and saturates at the numeric bounds instead of overflowing.

assert_eq!(Percent::from_percent(50).saturating_reciprocal_mul(10u64), 20);
Source

fn saturating_reciprocal_mul_floor<N>(self, b: N) -> N
where N: Clone + UniqueSaturatedInto<Self::Inner> + Rem<Output = N> + Div<Output = N> + Mul<Output = N> + Add<Output = N> + Saturating + Unsigned, Self::Inner: Into<N>,

Saturating multiplication by the reciprocal of self. The result is rounded down to the nearest whole number and saturates at the numeric bounds instead of overflowing.

// round to nearest
assert_eq!(Percent::from_percent(60).saturating_reciprocal_mul(10u64), 17);
// round down
assert_eq!(Percent::from_percent(60).saturating_reciprocal_mul_floor(10u64), 16);
Source

fn saturating_reciprocal_mul_ceil<N>(self, b: N) -> N
where N: Clone + UniqueSaturatedInto<Self::Inner> + Rem<Output = N> + Div<Output = N> + Mul<Output = N> + Add<Output = N> + Saturating + Unsigned, Self::Inner: Into<N>,

Saturating multiplication by the reciprocal of self. The result is rounded up to the nearest whole number and saturates at the numeric bounds instead of overflowing.

// round to nearest
assert_eq!(Percent::from_percent(61).saturating_reciprocal_mul(10u64), 16);
// round up
assert_eq!(Percent::from_percent(61).saturating_reciprocal_mul_ceil(10u64), 17);

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementors§

Source§

impl PerThing for PerU16

Source§

const ACCURACY: <PerU16 as PerThing>::Inner = {transmute(0xffff): <arithmetic::PerU16 as arithmetic::PerThing>::Inner}

Source§

type Inner = u16

Source§

type Upper = u32

Source§

impl PerThing for Perbill

Source§

const ACCURACY: <Perbill as PerThing>::Inner = {transmute(0x3b9aca00): <arithmetic::Perbill as arithmetic::PerThing>::Inner}

Source§

type Inner = u32

Source§

type Upper = u64

Source§

impl PerThing for Percent

Source§

const ACCURACY: <Percent as PerThing>::Inner = {transmute(0x64): <arithmetic::Percent as arithmetic::PerThing>::Inner}

Source§

type Inner = u8

Source§

type Upper = u16

Source§

impl PerThing for Permill

Source§

const ACCURACY: <Permill as PerThing>::Inner = {transmute(0x000f4240): <arithmetic::Permill as arithmetic::PerThing>::Inner}

Source§

type Inner = u32

Source§

type Upper = u64

Source§

impl PerThing for Perquintill

Source§

const ACCURACY: <Perquintill as PerThing>::Inner = {transmute(0x0de0b6b3a7640000): <arithmetic::Perquintill as arithmetic::PerThing>::Inner}

Source§

type Inner = u64

Source§

type Upper = u128