[]Trait gstreamer_check::prelude::MulDiv

pub trait MulDiv<RHS = Self> {
    type Output;
    fn mul_div_floor(self, num: RHS, denom: RHS) -> Option<Self::Output>;
fn mul_div_round(self, num: RHS, denom: RHS) -> Option<Self::Output>;
fn mul_div_ceil(self, num: RHS, denom: RHS) -> Option<Self::Output>; }

Trait for calculating val * num / denom with different rounding modes and overflow protection.

Implementations of this trait have to ensure that even if the result of the multiplication does not fit into the type, as long as it would fit after the division the correct result has to be returned instead of None. None only should be returned if the overall result does not fit into the type.

This specifically means that e.g. the u64 implementation must, depending on the arguments, be able to do 128 bit integer multiplication.

Associated Types

type Output

Loading content...

Required methods

fn mul_div_floor(self, num: RHS, denom: RHS) -> Option<Self::Output>

Calculates floor(val * num / denom), i.e. the next integer to the result of the division with the smaller absolute value.

Example

extern crate muldiv;
use muldiv::MulDiv;

// Returns x==Some(6)
let x = 3i8.mul_div_floor(4, 2);

// Returns x==Some(3)
let x = 5i8.mul_div_floor(2, 3);

// Returns x==Some(-3)
let x = (-5i8).mul_div_floor(2, 3);

// Returns x==Some(4)
let x = 3i8.mul_div_floor(3, 2);

// Returns x==Some(-4)
let x = (-3i8).mul_div_floor(3, 2);

// Returns x==None
let x = 127i8.mul_div_floor(4, 3);

fn mul_div_round(self, num: RHS, denom: RHS) -> Option<Self::Output>

Calculates round(val * num / denom), i.e. the closest integer to the result of the division. If both surrounding integers are the same distance, the one with the bigger absolute value is returned.

Example

extern crate muldiv;
use muldiv::MulDiv;

// Returns x==Some(6)
let x = 3i8.mul_div_round(4, 2);

// Returns x==Some(3)
let x = 5i8.mul_div_round(2, 3);

// Returns x==Some(-3)
let x = (-5i8).mul_div_round(2, 3);

// Returns x==Some(5)
let x = 3i8.mul_div_round(3, 2);

// Returns x==Some(-5)
let x = (-3i8).mul_div_round(3, 2);

// Returns x==None
let x = 127i8.mul_div_floor(4, 3);

fn mul_div_ceil(self, num: RHS, denom: RHS) -> Option<Self::Output>

Calculates ceil(val * num / denom), i.e. the next integer to the result of the division with the bigger absolute value.

Example

extern crate muldiv;
use muldiv::MulDiv;

// Returns x==Some(6)
let x = 3i8.mul_div_ceil(4, 2);

// Returns x==Some(4)
let x = 5i8.mul_div_ceil(2, 3);

// Returns x==Some(-4)
let x = (-5i8).mul_div_ceil(2, 3);

// Returns x==Some(5)
let x = 3i8.mul_div_ceil(3, 2);

// Returns x==Some(-5)
let x = (-3i8).mul_div_ceil(3, 2);

// Returns x==None
let x = (127i8).mul_div_ceil(4, 3);
Loading content...

Implementations on Foreign Types

impl<'a> MulDiv<&'a ClockTime> for ClockTime[src]

type Output = ClockTime

impl MulDiv<Bytes> for Bytes[src]

type Output = Bytes

impl<'a> MulDiv<&'a Default> for Default[src]

type Output = Default

impl MulDiv<ClockTime> for ClockTime[src]

type Output = ClockTime

impl<'a> MulDiv<&'a Bytes> for Bytes[src]

type Output = Bytes

impl MulDiv<Buffers> for Buffers[src]

type Output = Buffers

impl<'a> MulDiv<u64> for Buffers[src]

type Output = Buffers

impl<'a> MulDiv<u64> for ClockTime[src]

type Output = ClockTime

impl<'a> MulDiv<&'a u64> for Buffers[src]

type Output = Buffers

impl<'a> MulDiv<&'a u64> for Default[src]

type Output = Default

impl<'a> MulDiv<u64> for Default[src]

type Output = Default

impl MulDiv<Default> for Default[src]

type Output = Default

impl<'a> MulDiv<&'a Buffers> for Buffers[src]

type Output = Buffers

impl<'a> MulDiv<u64> for Bytes[src]

type Output = Bytes

impl<'a> MulDiv<&'a u64> for ClockTime[src]

type Output = ClockTime

impl<'a> MulDiv<&'a u64> for Bytes[src]

type Output = Bytes

impl MulDiv<u16> for u16

type Output = u16

impl MulDiv<i8> for i8

type Output = i8

impl MulDiv<u32> for u32

type Output = u32

impl MulDiv<i16> for i16

type Output = i16

impl MulDiv<u8> for u8

type Output = u8

impl MulDiv<i32> for i32

type Output = i32

impl MulDiv<i64> for i64

type Output = i64

impl MulDiv<u64> for u64

type Output = u64

Loading content...

Implementors

Loading content...