pub struct ConstEquidistant<R, const N: usize>(_);
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,

§

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<ConstEquidistant<R, N>> for ConstEquidistant<R, N>

source§

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

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

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

This method 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) -> usizewhere 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 ) -> usizewhere 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§

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> 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 Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

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

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

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

source§

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

Mutably borrows from an owned value. 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 Twhere 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 Twhere T: Clone,

§

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 Twhere U: Into<T>,

§

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 Twhere U: TryFrom<T>,

§

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.