orx_v

Struct ConstantVec

Source
pub struct ConstantVec<D, T, C = UnboundedCard<D>>
where D: Dim, T: Copy, C: Card<D>,
{ /* private fields */ }
Expand description

A constant vector which returns the same value for any input index.

§Example

use orx_v::*;

let v1 = V.d1().constant(42).bounded(4);

assert_eq!(v1.at([2]), 42);
assert_eq!(
    v1.equality(&[42, 42, 42, 42]),
    Equality::Equal
);

let v2 = V.d2().constant(42).with_rectangular_bounds([2, 3]);
assert_eq!(v2.at([0, 2]), 42);
assert_eq!(v2.at([1, 0]), 42);
assert_eq!(
    v2.equality(&vec![vec![42, 42, 42], vec![42, 42, 42]]),
    Equality::Equal
);

Implementations§

Source§

impl<D, T, C> ConstantVec<D, T, C>
where D: Dim, T: Copy, C: Card<D>,

Source

pub fn new(value: T, card: C) -> Self

Creates a new constant vector with the given card where all elements are equal to value.

Alternatively, unbounded constant vectors of different dimensions can be created by V.d1().constant(42), V.d2().constant(42), etc., which can later be transformed into bounded vectors by applying bounded, with_rectangular_bounds or with_variable_bounds transformations.

Source§

impl<T> ConstantVec<D1, T, UnboundedCard<D1>>
where T: Copy,

Source

pub fn bounded(self, num_elements: usize) -> ConstantVec<D1, T, CardD1>

Transforms an unbounded constant vector into one with a fixed length.

§Example
use orx_v::*;

let v1 = V.d1().constant(42);

assert_eq!(v1.card([]), usize::MAX);
assert_eq!(v1.at([2]), 42);
assert_eq!(v1.at([42]), 42);

let v1 = v1.bounded(4);
// or
let v1 = V.d1().constant(42).bounded(4);

assert_eq!(v1.card([]), 4);
assert_eq!(v1.at([2]), 42);
assert_eq!(v1.try_at([2]), Some(42));
assert_eq!(v1.try_at([42]), None);
assert_eq!(v1.all().collect::<Vec<_>>(), vec![42, 42, 42, 42]);

assert_eq!(v1.at([42]), 42); // (!) un-compromised performance

(!) un-compromised performance

Main reason to add bounds to a functional vector is to set its domain. However, calling at with an out-of-bounds index can still produce a valid element in order not to compromise performance. If we want to check whether or not an index is in bounds or not, we can use the in_bounds or card methods, or use try_at instead which would return None if the index is out of bounds.

Source§

impl<T> ConstantVec<D2, T, UnboundedCard<D2>>
where T: Copy,

Source

pub fn with_rectangular_bounds( self, dimensions: [usize; 2], ) -> ConstantVec<D2, T, RectangularCardD2>

Transforms an unbounded constant vector into one with rectangular bounds as in matrices:

  • the vector has dimensions[0] children, and
  • each children has dimensions[1] elements.
§Example
use orx_v::*;

let v2 = V.d2().constant(42).with_rectangular_bounds([2, 3]);

assert_eq!(v2.card([]), 2);
assert_eq!(v2.card([0]), 3);
assert_eq!(v2.card([1]), 3);
assert_eq!(v2.at([0, 2]), 42);
assert_eq!(v2.at([1, 0]), 42);
assert_eq!(
    v2.equality(&vec![vec![42, 42, 42], vec![42, 42, 42]]),
    Equality::Equal
);

assert_eq!(v2.try_at([42, 113]), None);
assert_eq!(v2.at([42, 113]), 42); // (!) un-compromised performance

(!) un-compromised performance

Main reason to add bounds to a functional vector is to set its domain. However, calling at with an out-of-bounds index can still produce a valid element in order not to compromise performance. If we want to check whether or not an index is in bounds or not, we can use the in_bounds or card methods, or use try_at instead which would return None if the index is out of bounds.

Source

pub fn with_variable_bounds<C>( self, cardinality: C, ) -> ConstantVec<D2, T, VariableCardD2<C>>
where C: V1<usize>,

Transforms an unbounded constant vector into one with variable bounds as in jagged arrays:

  • the vector has cardinality.card([]) children, and
  • i-th child has cardinality.at([i]) elements.
§Example
use orx_v::*;

// jagged => [ [42, 42], [42, 42, 42], [42] ]
let num_cols = vec![2, 3, 1];
let v2 = V.d2().constant(42).with_variable_bounds(&num_cols);

assert_eq!(v2.card([]), 3);
assert_eq!(v2.card([0]), 2);
assert_eq!(v2.card([1]), 3);
assert_eq!(v2.card([2]), 1);
assert_eq!(v2.at([1, 2]), 42);
assert_eq!(v2.at([2, 0]), 42);
assert_eq!(
    v2.equality(&vec![vec![42, 42], vec![42, 42, 42], vec![42]]),
    Equality::Equal
);

assert_eq!(v2.try_at([42, 113]), None);
assert_eq!(v2.at([42, 113]), 42); // (!) un-compromised performance

(!) un-compromised performance

Main reason to add bounds to a functional vector is to set its domain. However, calling at with an out-of-bounds index can still produce a valid element in order not to compromise performance. If we want to check whether or not an index is in bounds or not, we can use the in_bounds or card methods, or use try_at instead which would return None if the index is out of bounds.

Source§

impl<T> ConstantVec<D3, T, UnboundedCard<D3>>
where T: Copy,

Source

pub fn with_rectangular_bounds( self, dimensions: [usize; 3], ) -> ConstantVec<D3, T, RectangularCardD3>

Transforms an unbounded constant vector into one with rectangular bounds as in multi-dimensional matrices. The matrix has dimensions[0] x dimensions[1] x dimensions[2] elements.

§Example
use orx_v::*;

let v2 = V.d2().constant(42).with_rectangular_bounds([2, 3]);

assert_eq!(v2.card([]), 2);
assert_eq!(v2.card([0]), 3);
assert_eq!(v2.card([1]), 3);
assert_eq!(v2.at([0, 2]), 42);
assert_eq!(v2.at([1, 0]), 42);
assert_eq!(
    v2.equality(&vec![vec![42, 42, 42], vec![42, 42, 42]]),
    Equality::Equal
);

assert_eq!(v2.try_at([42, 113]), None);
assert_eq!(v2.at([42, 113]), 42); // (!) un-compromised performance

(!) un-compromised performance

Main reason to add bounds to a functional vector is to set its domain. However, calling at with an out-of-bounds index can still produce a valid element in order not to compromise performance. If we want to check whether or not an index is in bounds or not, we can use the in_bounds or card methods, or use try_at instead which would return None if the index is out of bounds.

Source

pub fn with_variable_bounds<C>( self, cardinality: C, ) -> ConstantVec<D3, T, VariableCardD3<C>>
where C: V2<usize>,

Transforms an unbounded constant vector into one with variable bounds as in jagged arrays:

  • the vector has cardinality.card([]) children, and
  • i-th child has cardinality.at([i]) elements.
§Example
use orx_v::*;

// jagged => [ [42, 42], [42, 42, 42], [42] ]
let num_cols = vec![2, 3, 1];
let v2 = V.d2().constant(42).with_variable_bounds(&num_cols);

assert_eq!(v2.card([]), 3);
assert_eq!(v2.card([0]), 2);
assert_eq!(v2.card([1]), 3);
assert_eq!(v2.card([2]), 1);
assert_eq!(v2.at([1, 2]), 42);
assert_eq!(v2.at([2, 0]), 42);
assert_eq!(
    v2.equality(&vec![vec![42, 42], vec![42, 42, 42], vec![42]]),
    Equality::Equal
);

assert_eq!(v2.try_at([42, 113]), None);
assert_eq!(v2.at([42, 113]), 42); // (!) un-compromised performance

(!) un-compromised performance

Main reason to add bounds to a functional vector is to set its domain. However, calling at with an out-of-bounds index can still produce a valid element in order not to compromise performance. If we want to check whether or not an index is in bounds or not, we can use the in_bounds or card methods, or use try_at instead which would return None if the index is out of bounds.

Source§

impl<T> ConstantVec<D4, T, UnboundedCard<D4>>
where T: Copy,

Source

pub fn with_rectangular_bounds( self, dimensions: [usize; 4], ) -> ConstantVec<D4, T, RectangularCardD4>

Transforms an unbounded constant vector into one with rectangular bounds as in multi-dimensional matrices. The matrix has dimensions[0] x dimensions[1] x dimensions[2] x dimensions[3] elements.

§Example
use orx_v::*;

let v2 = V.d2().constant(42).with_rectangular_bounds([2, 3]);

assert_eq!(v2.card([]), 2);
assert_eq!(v2.card([0]), 3);
assert_eq!(v2.card([1]), 3);
assert_eq!(v2.at([0, 2]), 42);
assert_eq!(v2.at([1, 0]), 42);
assert_eq!(
    v2.equality(&vec![vec![42, 42, 42], vec![42, 42, 42]]),
    Equality::Equal
);

assert_eq!(v2.try_at([42, 113]), None);
assert_eq!(v2.at([42, 113]), 42); // (!) un-compromised performance

(!) un-compromised performance

Main reason to add bounds to a functional vector is to set its domain. However, calling at with an out-of-bounds index can still produce a valid element in order not to compromise performance. If we want to check whether or not an index is in bounds or not, we can use the in_bounds or card methods, or use try_at instead which would return None if the index is out of bounds.

Source

pub fn with_variable_bounds<C>( self, cardinality: C, ) -> ConstantVec<D4, T, VariableCardD4<C>>
where C: V3<usize>,

Transforms an unbounded constant vector into one with variable bounds as in jagged arrays:

  • the vector has cardinality.card([]) children, and
  • i-th child has cardinality.at([i]) elements.
§Example
use orx_v::*;

// jagged => [ [42, 42], [42, 42, 42], [42] ]
let num_cols = vec![2, 3, 1];
let v2 = V.d2().constant(42).with_variable_bounds(&num_cols);

assert_eq!(v2.card([]), 3);
assert_eq!(v2.card([0]), 2);
assert_eq!(v2.card([1]), 3);
assert_eq!(v2.card([2]), 1);
assert_eq!(v2.at([1, 2]), 42);
assert_eq!(v2.at([2, 0]), 42);
assert_eq!(
    v2.equality(&vec![vec![42, 42], vec![42, 42, 42], vec![42]]),
    Equality::Equal
);

assert_eq!(v2.try_at([42, 113]), None);
assert_eq!(v2.at([42, 113]), 42); // (!) un-compromised performance

(!) un-compromised performance

Main reason to add bounds to a functional vector is to set its domain. However, calling at with an out-of-bounds index can still produce a valid element in order not to compromise performance. If we want to check whether or not an index is in bounds or not, we can use the in_bounds or card methods, or use try_at instead which would return None if the index is out of bounds.

Trait Implementations§

Source§

impl<D, T, C> Clone for ConstantVec<D, T, C>
where D: Dim + Clone, T: Copy + Clone, C: Card<D> + Clone,

Source§

fn clone(&self) -> ConstantVec<D, T, C>

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<T, C> Debug for ConstantVec<D1, T, C>
where T: Copy + Debug, C: Card<D1>,

Source§

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

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

impl<T, C> Debug for ConstantVec<D2, T, C>
where T: Copy + Debug, C: Card<D2>,

Source§

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

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

impl<T, C> Debug for ConstantVec<D3, T, C>
where T: Copy + Debug, C: Card<D3>,

Source§

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

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

impl<T, C> Debug for ConstantVec<D4, T, C>
where T: Copy + Debug, C: Card<D4>,

Source§

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

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

impl<D, T, C> NVec<D, T> for ConstantVec<D, T, C>
where D: Dim, T: Copy, C: Card<D>,

Source§

fn at(&self, _: impl IntoIdx<D>) -> T

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

fn child(&self, i: <D as Dim>::ChildIdx) -> impl NVec<<D 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<D, T, C> Copy for ConstantVec<D, T, C>
where D: Dim + Copy, T: Copy + Copy, C: Card<D> + Copy,

Auto Trait Implementations§

§

impl<D, T, C> Freeze for ConstantVec<D, T, C>
where T: Freeze, C: Freeze,

§

impl<D, T, C> RefUnwindSafe for ConstantVec<D, T, C>

§

impl<D, T, C> Send for ConstantVec<D, T, C>
where T: Send, C: Send, D: Send,

§

impl<D, T, C> Sync for ConstantVec<D, T, C>
where T: Sync, C: Sync, D: Sync,

§

impl<D, T, C> Unpin for ConstantVec<D, T, C>
where T: Unpin, C: Unpin, D: Unpin,

§

impl<D, T, C> UnwindSafe for ConstantVec<D, T, C>
where T: UnwindSafe, C: UnwindSafe, D: UnwindSafe,

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, dst: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. 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> 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.
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>,