orx_v

Struct CachedVec

Source
pub struct CachedVec<D, T, V, C = DefaultCache<D, T>>
where D: Dim, V: NVec<D, T>, C: Cache<D::Idx, T>, T: Copy,
{ /* private fields */ }
Expand description

Wraps an NVec<D, T> into a cached vector which maintains an internal cache.

Each time an element is requested, the vector first checks the cache:

  • if the value is readily available in the cache, the vector returns it,
  • otherwise, it computes its value, caches it for future use and returns it.

The cache is often a simple lookup or map, such as the HashMap. However, it might be more advanced such as the least frequently used cache. Any internal structure implementing the Cache can be used.

The aim of the cached vector is to improve the execution time where computing an element is expensive. Consider for instance element (i, j) corresponds to the duration between two addresses i and j on a street network which requires running an algorithm to compute. Further assume that:

  • pre-computing all elements is not justified as we will access only a small portion of the entire matrix, and
  • we do not know ahead of time which indices that we will access.

In such scenarios, IntoCached trait makes it very convenient to convert a functional vector into a cached functional vector.

§Examples

use orx_v::*;

// assume an expensive api call to compute distance
fn api_call_to_get_distance(from: usize, to: usize) -> u64 {
    match from > to {
        true => (from - to) as u64,
        false => (to - from) as u64,
    }
}

let v2 = V.d2().fun(|[i, j]| api_call_to_get_distance(i, j)).into_cached();
assert_eq!(v2.cache_len(), 0);

// makes the api call; caches and returns the value
assert_eq!(v2.at([0, 3]), 3);
assert_eq!(v2.cache_len(), 1);

// does not repeat the api call; returns the value from the cache
assert_eq!(v2.at([0, 3]), 3);

Implementations§

Source§

impl<D, T, V, C> CachedVec<D, T, V, C>
where D: Dim, V: NVec<D, T>, C: Cache<D::Idx, T>, T: Copy,

Source

pub fn into_inner(self) -> (V, C)

Destructs the cached vec and returns the tuple of the underlying NVec<D, T> and cache.

Note that a new cached vector can be constructed by re-using the cache by calling the into_cached_with method on the vec.

Source

pub fn clean_cache(&mut self)

Clears the internal cache of the cached vector; i.e., forgets all cached elements.

Source

pub fn cache_len(&self) -> usize

Returns the number of elements which are currently available in the cache.

Trait Implementations§

Source§

impl<T, V, C> Debug for CachedVec<D1, T, V, C>
where V: NVec<D1, T>, C: Cache<<D1 as Dim>::Idx, T>, T: Copy + Debug, Self: NVec<D1, T>,

Source§

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

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

impl<T, V, C> Debug for CachedVec<D2, T, V, C>
where V: NVec<D2, T>, C: Cache<<D2 as Dim>::Idx, T>, T: Copy + Debug, Self: NVec<D2, T>,

Source§

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

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

impl<T, V, C> Debug for CachedVec<D3, T, V, C>
where V: NVec<D3, T>, C: Cache<<D3 as Dim>::Idx, T>, T: Copy + Debug, Self: NVec<D3, T>,

Source§

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

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

impl<T, V, C> Debug for CachedVec<D4, T, V, C>
where V: NVec<D4, T>, C: Cache<<D4 as Dim>::Idx, T>, T: Copy + Debug, Self: NVec<D4, T>,

Source§

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

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

impl<T, V, C> NVec<D1, T> for CachedVec<D1, T, V, C>
where V: NVec<D1, T>, C: Cache<<D1 as Dim>::Idx, T>, T: Copy,

Source§

fn at(&self, idx: impl IntoIdx<D1>) -> T

Returns the element at the idx-th position of the vector. Read more
Source§

fn child(&self, _: <D1 as Dim>::ChildIdx) -> impl NVec<<D1 as Dim>::PrevDim, T>

Returns the i-th child of the vector. Read more
Source§

fn all(&self) -> impl Iterator<Item = T>

Returns a flattened iterator over all scalar (D0) elements of the vector. Read more
Source§

fn num_children(&self) -> usize

Returns the number of children of the vector; i.e., number of elements of the one lower dimension. Read more
Source§

fn card(&self, idx: impl Into<D::CardIdx>) -> usize

Returns the cardinality of the vec in any of the lower dimensions. Read more
Source§

fn is_bounded(&self) -> bool

Returns whether or not the vector is bounded. Read more
Source§

fn is_rectangular(&self) -> bool

Returns whether or not the cardinalities of the vector are rectangular. A rectangular vector of dimension D has the same number of children at a given lower dimension for all indices. Read more
Source§

fn is_unbounded(&self) -> bool

Returns whether or not the vector is unbounded. Read more
Source§

fn in_bounds(&self, idx: impl Into<D::LeqIdx>) -> bool

Returns whether or not the given idx is in bounds. Read more
Source§

fn card_equality(&self, other: &impl NVec<D, T>) -> CardEquality<D>

Returns the cardinality equality of this vec with the other: Read more
Source§

fn try_at(&self, idx: impl IntoIdx<D>) -> Option<T>

Returns the element at the idx-th position of the vector if the index is in_bounds; returns None otherwise. Read more
Source§

fn equality(&self, other: &impl NVec<D, T>) -> Equality<D>
where T: PartialEq,

Returns the equality of this vec with the other: Read more
Source§

fn children(&self) -> impl Iterator<Item = impl NVec<D::PrevDim, T>>

Returns an iterator of all children of the vector. Read more
Source§

fn all_in( &self, indices: impl Iterator<Item = impl IntoIdx<D>>, ) -> impl Iterator<Item = T>

Returns an iterator of elements for the given indices. Read more
Source§

impl<T, V, C> NVec<D2, T> for CachedVec<D2, T, V, C>
where V: NVec<D2, T>, C: Cache<<D2 as Dim>::Idx, T>, T: Copy,

Source§

fn at(&self, idx: impl IntoIdx<D2>) -> T

Returns the element at the idx-th position of the vector. Read more
Source§

fn child(&self, i: <D2 as Dim>::ChildIdx) -> impl NVec<<D2 as Dim>::PrevDim, T>

Returns the i-th child of the vector. Read more
Source§

fn all(&self) -> impl Iterator<Item = T>

Returns a flattened iterator over all scalar (D0) elements of the vector. Read more
Source§

fn num_children(&self) -> usize

Returns the number of children of the vector; i.e., number of elements of the one lower dimension. Read more
Source§

fn card(&self, idx: impl Into<D::CardIdx>) -> usize

Returns the cardinality of the vec in any of the lower dimensions. Read more
Source§

fn is_bounded(&self) -> bool

Returns whether or not the vector is bounded. Read more
Source§

fn is_rectangular(&self) -> bool

Returns whether or not the cardinalities of the vector are rectangular. A rectangular vector of dimension D has the same number of children at a given lower dimension for all indices. Read more
Source§

fn is_unbounded(&self) -> bool

Returns whether or not the vector is unbounded. Read more
Source§

fn in_bounds(&self, idx: impl Into<D::LeqIdx>) -> bool

Returns whether or not the given idx is in bounds. Read more
Source§

fn card_equality(&self, other: &impl NVec<D, T>) -> CardEquality<D>

Returns the cardinality equality of this vec with the other: Read more
Source§

fn try_at(&self, idx: impl IntoIdx<D>) -> Option<T>

Returns the element at the idx-th position of the vector if the index is in_bounds; returns None otherwise. Read more
Source§

fn equality(&self, other: &impl NVec<D, T>) -> Equality<D>
where T: PartialEq,

Returns the equality of this vec with the other: Read more
Source§

fn children(&self) -> impl Iterator<Item = impl NVec<D::PrevDim, T>>

Returns an iterator of all children of the vector. Read more
Source§

fn all_in( &self, indices: impl Iterator<Item = impl IntoIdx<D>>, ) -> impl Iterator<Item = T>

Returns an iterator of elements for the given indices. Read more
Source§

impl<T, V, C> NVec<D3, T> for CachedVec<D3, T, V, C>
where V: NVec<D3, T>, C: Cache<<D3 as Dim>::Idx, T>, T: Copy,

Source§

fn at(&self, idx: impl IntoIdx<D3>) -> T

Returns the element at the idx-th position of the vector. Read more
Source§

fn child(&self, i: <D3 as Dim>::ChildIdx) -> impl NVec<<D3 as Dim>::PrevDim, T>

Returns the i-th child of the vector. Read more
Source§

fn all(&self) -> impl Iterator<Item = T>

Returns a flattened iterator over all scalar (D0) elements of the vector. Read more
Source§

fn num_children(&self) -> usize

Returns the number of children of the vector; i.e., number of elements of the one lower dimension. Read more
Source§

fn card(&self, idx: impl Into<D::CardIdx>) -> usize

Returns the cardinality of the vec in any of the lower dimensions. Read more
Source§

fn is_bounded(&self) -> bool

Returns whether or not the vector is bounded. Read more
Source§

fn is_rectangular(&self) -> bool

Returns whether or not the cardinalities of the vector are rectangular. A rectangular vector of dimension D has the same number of children at a given lower dimension for all indices. Read more
Source§

fn is_unbounded(&self) -> bool

Returns whether or not the vector is unbounded. Read more
Source§

fn in_bounds(&self, idx: impl Into<D::LeqIdx>) -> bool

Returns whether or not the given idx is in bounds. Read more
Source§

fn card_equality(&self, other: &impl NVec<D, T>) -> CardEquality<D>

Returns the cardinality equality of this vec with the other: Read more
Source§

fn try_at(&self, idx: impl IntoIdx<D>) -> Option<T>

Returns the element at the idx-th position of the vector if the index is in_bounds; returns None otherwise. Read more
Source§

fn equality(&self, other: &impl NVec<D, T>) -> Equality<D>
where T: PartialEq,

Returns the equality of this vec with the other: Read more
Source§

fn children(&self) -> impl Iterator<Item = impl NVec<D::PrevDim, T>>

Returns an iterator of all children of the vector. Read more
Source§

fn all_in( &self, indices: impl Iterator<Item = impl IntoIdx<D>>, ) -> impl Iterator<Item = T>

Returns an iterator of elements for the given indices. Read more
Source§

impl<T, V, C> NVec<D4, T> for CachedVec<D4, T, V, C>
where V: NVec<D4, T>, C: Cache<<D4 as Dim>::Idx, T>, T: Copy,

Source§

fn at(&self, idx: impl IntoIdx<D4>) -> T

Returns the element at the idx-th position of the vector. Read more
Source§

fn child(&self, i: <D4 as Dim>::ChildIdx) -> impl NVec<<D4 as Dim>::PrevDim, T>

Returns the i-th child of the vector. Read more
Source§

fn all(&self) -> impl Iterator<Item = T>

Returns a flattened iterator over all scalar (D0) elements of the vector. Read more
Source§

fn num_children(&self) -> usize

Returns the number of children of the vector; i.e., number of elements of the one lower dimension. Read more
Source§

fn card(&self, idx: impl Into<D::CardIdx>) -> usize

Returns the cardinality of the vec in any of the lower dimensions. Read more
Source§

fn is_bounded(&self) -> bool

Returns whether or not the vector is bounded. Read more
Source§

fn is_rectangular(&self) -> bool

Returns whether or not the cardinalities of the vector are rectangular. A rectangular vector of dimension D has the same number of children at a given lower dimension for all indices. Read more
Source§

fn is_unbounded(&self) -> bool

Returns whether or not the vector is unbounded. Read more
Source§

fn in_bounds(&self, idx: impl Into<D::LeqIdx>) -> bool

Returns whether or not the given idx is in bounds. Read more
Source§

fn card_equality(&self, other: &impl NVec<D, T>) -> CardEquality<D>

Returns the cardinality equality of this vec with the other: Read more
Source§

fn try_at(&self, idx: impl IntoIdx<D>) -> Option<T>

Returns the element at the idx-th position of the vector if the index is in_bounds; returns None otherwise. Read more
Source§

fn equality(&self, other: &impl NVec<D, T>) -> Equality<D>
where T: PartialEq,

Returns the equality of this vec with the other: Read more
Source§

fn children(&self) -> impl Iterator<Item = impl NVec<D::PrevDim, T>>

Returns an iterator of all children of the vector. Read more
Source§

fn all_in( &self, indices: impl Iterator<Item = impl IntoIdx<D>>, ) -> impl Iterator<Item = T>

Returns an iterator of elements for the given indices. Read more

Auto Trait Implementations§

§

impl<D, T, V, C = HashMap<<D as Dim>::Idx, T>> !Freeze for CachedVec<D, T, V, C>

§

impl<D, T, V, C = HashMap<<D as Dim>::Idx, T>> !RefUnwindSafe for CachedVec<D, T, V, C>

§

impl<D, T, V, C> Send for CachedVec<D, T, V, C>
where V: Send, C: Send, D: Send, T: Send,

§

impl<D, T, V, C = HashMap<<D as Dim>::Idx, T>> !Sync for CachedVec<D, T, V, C>

§

impl<D, T, V, C> Unpin for CachedVec<D, T, V, C>
where V: Unpin, C: Unpin, D: Unpin, T: Unpin,

§

impl<D, T, V, C> UnwindSafe for CachedVec<D, T, V, C>

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> 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, V> IntoJagged<T> for V
where V: NVec<D1, T>,

Source§

fn into_jagged<I>(self, row_end_indices: I) -> FlatJagged<Self, I, T>
where I: NVec<D1, usize>,

Converts a D1 vector into a jagged D2 vector where each row is identified by row_end_indices. Read more
Source§

fn as_jagged<I>(&self, row_end_indices: I) -> FlatJagged<&Self, I, T>
where I: NVec<D1, usize>,

From a flat D1 vector, creates a jagged D2 vector view where each row is identified by row_end_indices. Read more
Source§

fn as_jagged_mut<I>( &mut self, row_end_indices: I, ) -> FlatJagged<&mut Self, I, T>
where I: NVec<D1, usize>,

From a flat D1 vector, creates a mutable jagged D2 vector view where each row is identified by row_end_indices. Read more
Source§

fn into_jagged_from_row_lengths<I>( self, row_lengths: &I, ) -> FlatJagged<Self, Vec<usize>, T>
where I: NVec<D1, usize>,

Converts a D1 vector into a jagged D2 vector where each row is identified by row_lengths. Read more
Source§

fn as_jagged_from_row_lengths<I>( &self, row_lengths: &I, ) -> FlatJagged<&Self, Vec<usize>, T>
where I: NVec<D1, usize>,

From a flat D1 vector, creates a jagged D2 vector view where each row is identified by row_lengths. Read more
Source§

fn as_jagged_mut_from_row_lengths<I>( &mut self, row_lengths: &I, ) -> FlatJagged<&mut Self, Vec<usize>, T>
where I: NVec<D1, usize>,

From a flat D1 vector, creates a mutable jagged D2 vector view where each row is identified by row_lengths. Read more
Source§

fn into_jagged_with_uniform_lengths( self, uniform_length: usize, ) -> FlatJagged<Self, UniformEndIndices, T>

Converts a D1 vector into a jagged D2 vector where each row has the given uniform_length, except that the last row might have fewer elements if the cardinality of the D1 vector is not divisible by the uniform length. Read more
Source§

fn as_jagged_with_uniform_lengths( &self, uniform_length: usize, ) -> FlatJagged<&Self, UniformEndIndices, T>

From a flat D1 vector, creates a jagged D2 vector view where each row has the given uniform_length, except that the last row might have fewer elements if the cardinality of the D1 vector is not divisible by the uniform length. Read more
Source§

fn as_jagged_mut_with_uniform_lengths( &mut self, uniform_length: usize, ) -> FlatJagged<&mut Self, UniformEndIndices, T>

From a flat D1 vector, creates a mutable jagged D2 vector view where each row has the given uniform_length, except that the last row might have fewer elements if the cardinality of the D1 vector is not divisible by the uniform length. 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.
Source§

impl<T, V> V1AsMatrix<T> for V
where V: NVec<D1, T>,

Source§

fn v1_into_matrix( self, num_rows: usize, num_cols: usize, ) -> V1Matrix<T, Self, V1LayoutRowMajor>
where Self: NVec<D1, T>,

Converts the flat D1 vector into a row-major matrix. Read more
Source§

fn v1_as_matrix( &self, num_rows: usize, num_cols: usize, ) -> V1Matrix<T, &Self, V1LayoutRowMajor>
where Self: NVec<D1, T>,

Creates a row-major matrix view over the flat D1 vector. Read more
Source§

fn v1_as_matrix_mut( &mut self, num_rows: usize, num_cols: usize, ) -> V1Matrix<T, &mut Self, V1LayoutRowMajor>
where Self: NVecMut<D1, T>,

Creates a mutable row-major matrix view over the flat D1 vector. Read more
Source§

fn v1_into_matrix_col_major( self, num_rows: usize, num_cols: usize, ) -> V1Matrix<T, Self, V1LayoutColMajor>
where Self: NVec<D1, T>,

Converts the flat D1 vector into a column-major matrix. Read more
Source§

fn v1_as_matrix_col_major( &self, num_rows: usize, num_cols: usize, ) -> V1Matrix<T, &Self, V1LayoutColMajor>
where Self: NVec<D1, T>,

Creates a column-major matrix view over the flat D1 vector. Read more
Source§

fn v1_as_matrix_col_major_mut( &mut self, num_rows: usize, num_cols: usize, ) -> V1Matrix<T, &mut Self, V1LayoutColMajor>
where Self: NVecMut<D1, T>,

Creates a mutable column-major matrix view over the flat D1 vector. Read more
Source§

impl<T, V> V2AsMatrix<T> for V
where V: NVec<D2, T>,

Source§

fn into_matrix(self) -> V2MatrixRowMajor<T, Self>
where Self: NVec<D2, T>,

Converts the rectangular D2 vector into a row-major matrix. Read more
Source§

fn as_matrix(&self) -> V2MatrixRowMajor<T, &Self>
where Self: NVec<D2, T>,

Creates a row-major matrix view over the rectangular D2 vector. Read more
Source§

fn as_matrix_mut(&mut self) -> V2MatrixRowMajor<T, &mut Self>
where Self: NVecMut<D2, T>,

Creates a mutable row-major matrix view over the rectangular D2 vector. Read more
Source§

fn into_matrix_col_major(self) -> V2MatrixColMajor<T, Self>
where Self: NVec<D2, T>,

Converts the rectangular D2 vector into a column-major matrix. Read more
Source§

fn as_matrix_col_major(&self) -> V2MatrixColMajor<T, &Self>
where Self: NVec<D2, T>,

Creates a column-major matrix view over the rectangular D2 vector. Read more
Source§

fn as_matrix_col_major_mut(&mut self) -> V2MatrixColMajor<T, &mut Self>
where Self: NVecMut<D2, T>,

Creates a mutable column-major matrix view over the rectangular D2 vector. Read more
Source§

impl<D, V, T> NVecCore<D, T> for V
where D: Dim, V: NVecCoreSealed<D, T>,

Source§

impl<T, N> V1<T> for N
where N: NVec<D1, T>,

Source§

impl<T, N> V2<T> for N
where N: NVec<D2, T>,

Source§

impl<T, N> V3<T> for N
where N: NVec<D3, T>,

Source§

impl<T, N> V4<T> for N
where N: NVec<D4, T>,