Struct ConstEquidistant

Source
pub struct ConstEquidistant<R, const N: usize>(/* private fields */);
Expand description

Struct used as a generator for equidistant elements in constant context. Acts like an array of knots.

This struct is necessary as to date neither generic bounds nor floating point opterations are allowed in constant functions. Such to be able to use Equidistant in a constant context, we use this structure instead.

In comparison to Equidistant, this struct is slower (as it has to do more calculations) and only represents knots in [0.0,1.0]. However as knot base for interpolations, it is more performant, as we have the knowledge of the domain.

Implementations§

Source§

impl<R, const N: usize> ConstEquidistant<R, N>

Source

pub const fn new() -> Self

Create a list of equidistant real numbers. This struct should only be created in a constant context. Otherwise use Equidistant instead.

Trait Implementations§

Source§

impl<R: Clone, const N: usize> Clone for ConstEquidistant<R, N>

Source§

fn clone(&self) -> ConstEquidistant<R, N>

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<R: Debug, const N: usize> Debug for ConstEquidistant<R, N>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<R, const N: usize> DiscreteGenerator for ConstEquidistant<R, N>
where R: Real + FromPrimitive,

Source§

fn len(&self) -> usize

Returns the minimum amount of elements the generator can create. Read more
Source§

fn first(&self) -> Option<Self::Output>

Returns the first element of the generator, or None if it is empty.
Source§

fn last(&self) -> Option<Self::Output>

Returns the last element of the generator, or None if it is empty.
Source§

fn is_empty(&self) -> bool

Returns true if the generator does not generate any elements.
Source§

fn into_iter(self) -> IntoIter<Self>
where Self: Sized,

Convert generator to an iterator which steps through all generatable values.
Source§

fn iter(&self) -> IntoIter<&Self>

Create iterator which steps through all generatable values.
Source§

fn repeat(self) -> Repeat<Self>
where Self: Sized,

Transfrom generator to one which repeats its elements.
Source§

impl<R, const N: usize> Generator<usize> for ConstEquidistant<R, N>
where R: Real + FromPrimitive,

Source§

type Output = R

The element outputted
Source§

fn gen(&self, input: usize) -> R

Method to generate the element at the given input
Source§

fn extract<I, J>(self, iterator: I) -> Extract<Self, J>
where Self: Sized, I: IntoIterator<IntoIter = J>, J: Iterator<Item = Input>,

Helper function if one wants to extract values from the interpolation. Read more
Source§

fn stack<G>(self, gen: G) -> Stack<Self, G>
where Self: Sized,

Stack two generators together Read more
Source§

fn composite<G>(self, gen: G) -> Composite<Self, G>
where Self: Sized,

Takes two generators and creates a new generator pipelining both generators. Read more
Source§

fn by_ref(&self) -> &Self

Get a reference of the generator. Read more
Source§

fn sample<I, J>(&self, iterator: I) -> Extract<&Self, J>
where Self: Sized, I: IntoIterator<IntoIter = J>, J: Iterator<Item = Input>,

Helper function if one wants to sample values from the interpolation. Read more
Source§

impl<R: PartialEq, const N: usize> PartialEq for ConstEquidistant<R, N>

Source§

fn eq(&self, other: &ConstEquidistant<R, N>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<R, const N: usize> SortedGenerator for ConstEquidistant<R, N>
where R: Real + FromPrimitive,

Source§

fn strict_upper_bound(&self, element: Self::Output) -> usize
where Self::Output: PartialOrd + Copy,

Returns the smallest index for which the corresponding element is bigger then the input. If all elements are bigger, this function will return self.len().

§Panics

Panics if N is 0. May panic if N-1 can not be converted to type R.

§Examples
let equi = ConstEquidistant::<f64,11>::new();
assert_eq!(equi.strict_upper_bound(-1.0),0);
assert_eq!(equi.strict_upper_bound(0.15),2);
assert_eq!(equi.strict_upper_bound(20.0),11);
Source§

fn strict_upper_bound_clamped( &self, element: Self::Output, min: usize, max: usize, ) -> usize
where Self::Output: PartialOrd + Copy,

Returns the smallest index between min and max for which the corresponding element is bigger then the input. If all elements are bigger, this function will return the given maximum.

#Panic

Panics if min or max are not within [0,self.len()].

§Examples
let equi = ConstEquidistant::<f64,11>::new();
assert_eq!(equi.strict_upper_bound_clamped(-1.0,1,3),1);
assert_eq!(equi.strict_upper_bound_clamped(0.15,1,3),2);
assert_eq!(equi.strict_upper_bound_clamped(20.0,1,3),3);
Source§

fn upper_border(&self, element: R) -> (usize, usize, R)
where R: PartialOrd + Sub<Output = R> + Div<Output = R> + Copy + Debug,

Find the values inside the collection for which the given element is inbetween and a linear factor at how close it is to which value.

This function in general returns indices with values (first and second) such that first <= value <= second is true.

If the given element is smaller/bigger than every element in the collection, then the indices given will be the smallest/biggest possible.

§Remark

There are collections for which the returned values of this function are not uniquely defined. You may not assume any other invariant except first * factor + second * (1.0 - factor) == value, where value is the value inserted into this function, and the function returned (first, second, factor).

§Panics

Panics if self is has less than two elements. Also panics if length-1 as usize can not be converted to R.

§Examples
let equdist = ConstEquidistant::<f64,6>::new();
let values = vec![-1.0,0.0,0.15,0.6,1.0,20.0];
for value in values {
    let (min_index, max_index, factor) = equdist.upper_border(value);
    let min = equdist.gen(min_index);
    let max = equdist.gen(max_index);
    assert_f64_near!(utils::lerp(min,max,factor),value);
}
Source§

fn linear_factor_unchecked( &self, min_index: usize, max_index: usize, element: Self::Output, ) -> Self::Output
where Self::Output: Sub<Output = Self::Output> + Div<Output = Self::Output> + Copy,

Calculate the factor of element inbetween min and max. Read more
Source§

fn linear_factor( &self, min_index: usize, max_index: usize, element: Self::Output, ) -> Self::Output
where Self::Output: Sub<Output = Self::Output> + Div<Output = Self::Output> + Zero + Copy,

Calculate the factor of element inbetween min and max. Read more
Source§

impl<R: Copy, const N: usize> Copy for ConstEquidistant<R, N>

Source§

impl<R, const N: usize> StructuralPartialEq for ConstEquidistant<R, N>

Auto Trait Implementations§

§

impl<R, const N: usize> Freeze for ConstEquidistant<R, N>

§

impl<R, const N: usize> RefUnwindSafe for ConstEquidistant<R, N>
where R: RefUnwindSafe,

§

impl<R, const N: usize> !Send for ConstEquidistant<R, N>

§

impl<R, const N: usize> !Sync for ConstEquidistant<R, N>

§

impl<R, const N: usize> Unpin for ConstEquidistant<R, N>

§

impl<R, const N: usize> UnwindSafe for ConstEquidistant<R, N>
where R: RefUnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.