pub struct PointND<T, const N: usize> where
    T: Clone + Copy
{ /* private fields */ }
Expand description

The whole point of the crate (get it?)

This is basically just a small wrapper around an array with convenience methods for accessing values if it’s dimensions are within 1..=4

Examples

Constructing a Point

No matter how a PointND is constructed, the second generic arg must be filled with the number of dimensions it needs to have

If a point of zero dimensions is constructed, it will panic

// Creates a 2D point from values of a given vector or array
let vec: Vec<i32> = vec![0, 1];
let p: PointND<_, 2> = PointND::from(&vec);

// Creates a 3D point with all values set to 5
//  When using this function, complete type annotation is necessary
let p: PointND<i32, 3> = PointND::fill(5);

// ERROR: Can't create a point with zero dimensions
// let p: PointND<_, 0> = PointND::fill(9);

// If you don't like writing PointND twice, use this syntax instead
//  Note: The second generic must still be specified
let p = PointND::<_, 2>::from(&vec);

Accessing Values

It is recommended to use the convenience getters if the dimensions of the point are from 1..=4

// A 2D point
let arr: [i32; 2] = [0,1];
let p: PointND<_, 2> = PointND::from(&arr);

// As the point has 2 dimensions, we can access it's values with the x() and y() methods
let x: &i32 = p.x();
let y = p.y();

assert_eq!(*y, arr[1]);

// If the point had 3 dimensions, we could use the above and:
// let z = p.z();

// Or 4:
// ...
// let w = p.w();

Otherwise indexing or the get() method can be used

let arr: [i32; 2] = [0,1];
let p: PointND<_, 2> = PointND::from(&arr);

// Safely getting
//  Returns None if index is out of bounds
let x: Option<&i32> = p.get(0);
assert_eq!(*x.unwrap(), arr[0]);

// Unsafely indexing
//  If the index is out of bounds, this will panic
//  Note that unlike other accessing methods, this will return a copy of the value
let y: i32 = p[1];
assert_eq!(y, arr[1]);

Querying Size

The number of dimensions can be retrieved using the dims() method (short for dimensions)

let p: PointND<i32, 2> = PointND::fill(10);
assert_eq!(p.dims(), 2);

Iterating

The PointND struct does not implement iterating directly. The internal values must be accessed as an array in order to loop over them

let arr: [i32; 4] = [0,1,2,3];
let p: PointND<_, 4> = PointND::from(&arr);

// Use either one of:
let values:  [i32; 4] = p.as_arr();
let values: &[i32; 4] = p.values();
let values:  Vec<i32> = p.as_vec();

for (i, item) in values.into_iter().enumerate() {
    assert_eq!(item, arr[i]);
}

Implementations

Returns a new PointND with values from the specified array or vector

Panics

If the length of the slice is zero

Returns a new PointND with all values set as specified

Panics

If the dimensions of the point being constructed is zero

Returns the number of dimensions of the point (a 2D point will return 2, a 3D point 3, etc)

Returns the Some(value) at the specified dimension or None if the dimension is out of bounds

The value of the first dimension is indexed at 0 for easier interoperability with standard indexing

Returns a pointer to the array values stored by self

Returns an array of all the values contained by the point

Returns a vector of all the values contained by the point

Returns a new PointND from the values contained by self after applying the modifier function to them

Examples
// Multiplies each item by 10
let p = PointND::<i32, 3>::from(&[0, 1, 2]);
let p = p.apply(|item| item * 10);

assert_eq!(p.as_arr(), [0, 10, 20]);

Returns a new PointND from the values at the specified dimensions after applying the modifier function to them

Any values at dimensions that were not specified are passed as is

If any dimensions specified are out of bounds, this method will ignore it

Examples
// Multiplies items at indexes 1 and 2 by 2
let p = PointND::<i32, 4>::from(&[0, 1, 2, 3]);
let p = p.apply_dims(&[1, 2], |item| item * 2);

assert_eq!(p.as_arr(), [0, 2, 4, 3]);

Returns a new PointND from the values specified and those contained by self after applying the modifier to both

Examples
// Adds each item in the PointND with their respective items in the array
let p = PointND::<i32, 3>::from(&[0, 1, 2]);
let p = p.apply_vals([1, 2, 3], |a, b| a + b);

assert_eq!(p.as_arr(), [1, 3, 5]);

Returns a new PointND from the values contained by self and those of the point specified after applying the modifier to both

Function for safely getting and setting the first value contained by a 1D PointND

Functions for safely getting and setting the first and second values contained by a 2D PointND

Functions for safely getting and setting the first, second and third values contained by a 3D PointND

Functions for safely getting and setting the first, second, third and fourth values contained by a 4D PointND

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

The returned type after indexing.

Performs the indexing (container[index]) operation. Read more

Performs the mutable indexing (container[index]) operation. Read more

This method tests for self and other values to be equal, and is used by ==. Read more

This method tests for !=.

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Calls U::from(self).

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

The resulting type after obtaining ownership.

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

🔬 This is a nightly-only experimental API. (toowned_clone_into)

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

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.