[][src]Trait arraylib::Array

pub unsafe trait Array: Sized {
    type Item;
    type Maybe: Array<Item = MaybeUninit<Self::Item>>;

    const SIZE: usize;

    fn as_slice(&self) -> &[Self::Item];
fn as_mut_slice(&mut self) -> &mut [Self::Item];
fn try_unfold<St, F, E>(init: St, f: F) -> Result<Self, E>
    where
        F: FnMut(&mut St) -> Result<Self::Item, E>
;
fn unfold<St, F>(init: St, f: F) -> Self
    where
        F: FnMut(&mut St) -> Self::Item
;
fn try_from_fn<F, E>(f: F) -> Result<Self, E>
    where
        F: FnMut(usize) -> Result<Self::Item, E>
;
fn from_fn<F>(f: F) -> Self
    where
        F: FnMut(usize) -> Self::Item
;
fn from_iter<I>(iter: I) -> Option<Self>
    where
        I: IntoIterator<Item = Self::Item>
; fn into_uninit(self) -> Self::Maybe { ... }
fn uninit() -> Self::Maybe { ... }
unsafe fn assume_init(uninit: Self::Maybe) -> Self { ... }
fn into_boxed_slice(self) -> Box<[Self::Item]> { ... } }

Represent array of some size. E.g.: [u8; 32], [&str; 8], [T; N].

Sizes

See Sizes Limitations paragraph in crate docs.

Safety

By implementing this trait for type T you guarantee that

  1. T has the same ABI as [T::Item; T::Size]
  2. T::Maybe is an array of the same type ([MeybeUninit<T::Item>; T::Size])

Violating these rules will cause UB.

It is highly not recommended to implement this trait on your type unless you really know what you are doing.

Associated Types

type Item

Type of the Items in the array. i.e.

[T; 4]: Array<Item = T>

type Maybe: Array<Item = MaybeUninit<Self::Item>>

Same array but item is wrapped with MaybeUninit<_>.

[T; 4]: Array<Item = T, Maybe = [core::mem::MaybeUninit<T>; 4]>
Loading content...

Associated Constants

const SIZE: usize

Size of the array.

Example

use arraylib::Array;

assert_eq!(<[(); 0]>::SIZE, 0);
assert_eq!(<[(); 2]>::SIZE, 2);
Loading content...

Required methods

fn as_slice(&self) -> &[Self::Item]

Extracts a slice containing the entire array.

Example

use arraylib::Array;

let array = [1, 2, 3];
assert_eq!(array.as_slice()[1..], [2, 3]);

fn as_mut_slice(&mut self) -> &mut [Self::Item]

Extracts a mutable slice of the entire array.

Example

use arraylib::Array;

let mut array = [1, 0, 1];
array.as_mut_slice()[1] = 2;
assert_eq!(array, [1, 2, 1]);

fn try_unfold<St, F, E>(init: St, f: F) -> Result<Self, E> where
    F: FnMut(&mut St) -> Result<Self::Item, E>, 

Create new array, filled with elements returned by f. If f return Err then this method also return Err.

Example

use arraylib::Array;

let f = |it: &mut u32| {
    let res = Ok(*it);
    *it = it.checked_sub(10).ok_or(())?;
    res
};

let arr = <[_; 3]>::try_unfold(30, f);
assert_eq!(arr, Ok([30, 20, 10]));

let arr = <[_; 10]>::try_unfold(40, f);
assert_eq!(arr, Err(()));

fn unfold<St, F>(init: St, f: F) -> Self where
    F: FnMut(&mut St) -> Self::Item

Create new array, filled with elements returned by f

Example

use arraylib::Array;

let arr = <[_; 11]>::unfold(1, |it| {
    let res = *it;
    *it *= -2;
    res
});
assert_eq!(arr, [1, -2, 4, -8, 16, -32, 64, -128, 256, -512, 1024]);

fn try_from_fn<F, E>(f: F) -> Result<Self, E> where
    F: FnMut(usize) -> Result<Self::Item, E>, 

Create new array, filled with elements returned by f. If f return Err then this method also return Err.

Example

use arraylib::Array;

let f = |it| 250u8.checked_add(it as u8).ok_or(());

let arr = <[_; 3]>::try_from_fn(f);
assert_eq!(arr, Ok([250, 251, 252]));

let arr = <[_; 10]>::try_from_fn(f);
assert_eq!(arr, Err(()));

fn from_fn<F>(f: F) -> Self where
    F: FnMut(usize) -> Self::Item

Create new array, filled with elements returned by f

Example

use arraylib::Array;

let arr = <[_; 11]>::from_fn(|it| it.pow(2));
assert_eq!(arr, [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]);

fn from_iter<I>(iter: I) -> Option<Self> where
    I: IntoIterator<Item = Self::Item>, 

Creates an array from an iterator.

Examples

use arraylib::{Array, ArrayExt};

let iter = [-2, -1, 0, 1, 2].iter_move().filter(|it| it % 2 == 0);
let arr = <[i32; 2]>::from_iter(iter);

assert_eq!(arr, Some([-2, 0]));
//                    ^^^^^---- Note: `2` wasn't consumed
use arraylib::Array;
use std::iter::once;

let arr = <[i32; 2]>::from_iter(once(0));

assert_eq!(arr, None);
Loading content...

Provided methods

fn into_uninit(self) -> Self::Maybe

Converts self into [MaybeUninit<Self::Item>; Self::Size]. This function is used internally in this crate for some unsafe code.

Example

use arraylib::Array;
use std::mem::MaybeUninit;

let _: [MaybeUninit<bool>; 3] = [true, false, false].into_uninit();

fn uninit() -> Self::Maybe

Creates uninitialized array of MaybeUninit<T>.

Example

use arraylib::Array;
use std::mem::MaybeUninit;

let _: [MaybeUninit<i32>; 3] = <[i32; 3]>::uninit();

unsafe fn assume_init(uninit: Self::Maybe) -> Self

Extracts the values from the MaybeUninit<T> containers.

Safety

It is up to the caller to guarantee that all elements of the array are really in an initialized state. Calling this when the content is not yet fully initialized causes immediate undefined behavior. The MaybeUninit's type-level documentation contains more information about this initialization invariant.

See also MaybeUninit::assume_init documentation.

Examples

Correct usage of this method:

use arraylib::Array;
use std::mem::MaybeUninit;

let mut arr: [MaybeUninit<bool>; 4] = <[bool; 4]>::uninit();
for x in arr.iter_mut() {
    unsafe { x.as_mut_ptr().write(true) };
}

let arr_init: [bool; 4] = unsafe { <_>::assume_init(arr) };
assert_eq!(arr_init, [true; 4]);

Incorrect usage of this method:

use arraylib::Array;
use std::mem::MaybeUninit;

let mut arr: [MaybeUninit<bool>; 4] = <[bool; 4]>::uninit();
for i in 0..3 {
    unsafe { arr[i].as_mut_ptr().write(true) };
}

let arr_init: [bool; 4] = unsafe { <_>::assume_init(arr) };
// `arr[3]` had not been initialized yet, so this last line caused undefined behavior.

fn into_boxed_slice(self) -> Box<[Self::Item]>

Converts self into Box<[Self::Item]>

Loading content...

Implementors

impl<A> Array for ArrayWrapper<A> where
    A: Array
[src]

Safety

ArrayWrapper has #[repr(transparent)] so it has the same ABI as A. So if A is array then so is ArrayWrapper.

type Item = A::Item

type Maybe = ArrayWrapper<A::Maybe>

impl<T> Array for [T; 0][src]

type Item = T

type Maybe = [MaybeUninit<T>; 0]

impl<T> Array for [T; 1][src]

type Item = T

type Maybe = [MaybeUninit<T>; 1]

impl<T> Array for [T; 2][src]

type Item = T

type Maybe = [MaybeUninit<T>; 2]

impl<T> Array for [T; 3][src]

type Item = T

type Maybe = [MaybeUninit<T>; 3]

impl<T> Array for [T; 4][src]

type Item = T

type Maybe = [MaybeUninit<T>; 4]

impl<T> Array for [T; 5][src]

type Item = T

type Maybe = [MaybeUninit<T>; 5]

impl<T> Array for [T; 6][src]

type Item = T

type Maybe = [MaybeUninit<T>; 6]

impl<T> Array for [T; 7][src]

type Item = T

type Maybe = [MaybeUninit<T>; 7]

impl<T> Array for [T; 8][src]

type Item = T

type Maybe = [MaybeUninit<T>; 8]

impl<T> Array for [T; 9][src]

type Item = T

type Maybe = [MaybeUninit<T>; 9]

impl<T> Array for [T; 10][src]

type Item = T

type Maybe = [MaybeUninit<T>; 10]

impl<T> Array for [T; 11][src]

type Item = T

type Maybe = [MaybeUninit<T>; 11]

impl<T> Array for [T; 12][src]

type Item = T

type Maybe = [MaybeUninit<T>; 12]

impl<T> Array for [T; 13][src]

type Item = T

type Maybe = [MaybeUninit<T>; 13]

impl<T> Array for [T; 14][src]

type Item = T

type Maybe = [MaybeUninit<T>; 14]

impl<T> Array for [T; 15][src]

type Item = T

type Maybe = [MaybeUninit<T>; 15]

impl<T> Array for [T; 16][src]

type Item = T

type Maybe = [MaybeUninit<T>; 16]

impl<T> Array for [T; 17][src]

type Item = T

type Maybe = [MaybeUninit<T>; 17]

impl<T> Array for [T; 18][src]

type Item = T

type Maybe = [MaybeUninit<T>; 18]

impl<T> Array for [T; 19][src]

type Item = T

type Maybe = [MaybeUninit<T>; 19]

impl<T> Array for [T; 20][src]

type Item = T

type Maybe = [MaybeUninit<T>; 20]

impl<T> Array for [T; 21][src]

type Item = T

type Maybe = [MaybeUninit<T>; 21]

impl<T> Array for [T; 22][src]

type Item = T

type Maybe = [MaybeUninit<T>; 22]

impl<T> Array for [T; 23][src]

type Item = T

type Maybe = [MaybeUninit<T>; 23]

impl<T> Array for [T; 24][src]

type Item = T

type Maybe = [MaybeUninit<T>; 24]

impl<T> Array for [T; 25][src]

type Item = T

type Maybe = [MaybeUninit<T>; 25]

impl<T> Array for [T; 26][src]

type Item = T

type Maybe = [MaybeUninit<T>; 26]

impl<T> Array for [T; 27][src]

type Item = T

type Maybe = [MaybeUninit<T>; 27]

impl<T> Array for [T; 28][src]

type Item = T

type Maybe = [MaybeUninit<T>; 28]

impl<T> Array for [T; 29][src]

type Item = T

type Maybe = [MaybeUninit<T>; 29]

impl<T> Array for [T; 30][src]

type Item = T

type Maybe = [MaybeUninit<T>; 30]

impl<T> Array for [T; 31][src]

type Item = T

type Maybe = [MaybeUninit<T>; 31]

impl<T> Array for [T; 32][src]

type Item = T

type Maybe = [MaybeUninit<T>; 32]

impl<T> Array for [T; 33][src]

type Item = T

type Maybe = [MaybeUninit<T>; 33]

impl<T> Array for [T; 34][src]

type Item = T

type Maybe = [MaybeUninit<T>; 34]

impl<T> Array for [T; 35][src]

type Item = T

type Maybe = [MaybeUninit<T>; 35]

impl<T> Array for [T; 36][src]

type Item = T

type Maybe = [MaybeUninit<T>; 36]

impl<T> Array for [T; 37][src]

type Item = T

type Maybe = [MaybeUninit<T>; 37]

impl<T> Array for [T; 38][src]

type Item = T

type Maybe = [MaybeUninit<T>; 38]

impl<T> Array for [T; 39][src]

type Item = T

type Maybe = [MaybeUninit<T>; 39]

impl<T> Array for [T; 40][src]

type Item = T

type Maybe = [MaybeUninit<T>; 40]

impl<T> Array for [T; 41][src]

type Item = T

type Maybe = [MaybeUninit<T>; 41]

impl<T> Array for [T; 42][src]

type Item = T

type Maybe = [MaybeUninit<T>; 42]

impl<T> Array for [T; 43][src]

type Item = T

type Maybe = [MaybeUninit<T>; 43]

impl<T> Array for [T; 44][src]

type Item = T

type Maybe = [MaybeUninit<T>; 44]

impl<T> Array for [T; 45][src]

type Item = T

type Maybe = [MaybeUninit<T>; 45]

impl<T> Array for [T; 46][src]

type Item = T

type Maybe = [MaybeUninit<T>; 46]

impl<T> Array for [T; 47][src]

type Item = T

type Maybe = [MaybeUninit<T>; 47]

impl<T> Array for [T; 48][src]

type Item = T

type Maybe = [MaybeUninit<T>; 48]

impl<T> Array for [T; 49][src]

type Item = T

type Maybe = [MaybeUninit<T>; 49]

impl<T> Array for [T; 50][src]

type Item = T

type Maybe = [MaybeUninit<T>; 50]

impl<T> Array for [T; 51][src]

type Item = T

type Maybe = [MaybeUninit<T>; 51]

impl<T> Array for [T; 52][src]

type Item = T

type Maybe = [MaybeUninit<T>; 52]

impl<T> Array for [T; 53][src]

type Item = T

type Maybe = [MaybeUninit<T>; 53]

impl<T> Array for [T; 54][src]

type Item = T

type Maybe = [MaybeUninit<T>; 54]

impl<T> Array for [T; 55][src]

type Item = T

type Maybe = [MaybeUninit<T>; 55]

impl<T> Array for [T; 56][src]

type Item = T

type Maybe = [MaybeUninit<T>; 56]

impl<T> Array for [T; 57][src]

type Item = T

type Maybe = [MaybeUninit<T>; 57]

impl<T> Array for [T; 58][src]

type Item = T

type Maybe = [MaybeUninit<T>; 58]

impl<T> Array for [T; 59][src]

type Item = T

type Maybe = [MaybeUninit<T>; 59]

impl<T> Array for [T; 60][src]

type Item = T

type Maybe = [MaybeUninit<T>; 60]

impl<T> Array for [T; 61][src]

type Item = T

type Maybe = [MaybeUninit<T>; 61]

impl<T> Array for [T; 62][src]

type Item = T

type Maybe = [MaybeUninit<T>; 62]

impl<T> Array for [T; 63][src]

type Item = T

type Maybe = [MaybeUninit<T>; 63]

impl<T> Array for [T; 64][src]

type Item = T

type Maybe = [MaybeUninit<T>; 64]

impl<T> Array for [T; 65][src]

type Item = T

type Maybe = [MaybeUninit<T>; 65]

impl<T> Array for [T; 66][src]

type Item = T

type Maybe = [MaybeUninit<T>; 66]

impl<T> Array for [T; 67][src]

type Item = T

type Maybe = [MaybeUninit<T>; 67]

impl<T> Array for [T; 68][src]

type Item = T

type Maybe = [MaybeUninit<T>; 68]

impl<T> Array for [T; 69][src]

type Item = T

type Maybe = [MaybeUninit<T>; 69]

impl<T> Array for [T; 70][src]

type Item = T

type Maybe = [MaybeUninit<T>; 70]

impl<T> Array for [T; 71][src]

type Item = T

type Maybe = [MaybeUninit<T>; 71]

impl<T> Array for [T; 72][src]

type Item = T

type Maybe = [MaybeUninit<T>; 72]

impl<T> Array for [T; 73][src]

type Item = T

type Maybe = [MaybeUninit<T>; 73]

impl<T> Array for [T; 74][src]

type Item = T

type Maybe = [MaybeUninit<T>; 74]

impl<T> Array for [T; 75][src]

type Item = T

type Maybe = [MaybeUninit<T>; 75]

impl<T> Array for [T; 76][src]

type Item = T

type Maybe = [MaybeUninit<T>; 76]

impl<T> Array for [T; 77][src]

type Item = T

type Maybe = [MaybeUninit<T>; 77]

impl<T> Array for [T; 78][src]

type Item = T

type Maybe = [MaybeUninit<T>; 78]

impl<T> Array for [T; 79][src]

type Item = T

type Maybe = [MaybeUninit<T>; 79]

impl<T> Array for [T; 80][src]

type Item = T

type Maybe = [MaybeUninit<T>; 80]

impl<T> Array for [T; 81][src]

type Item = T

type Maybe = [MaybeUninit<T>; 81]

impl<T> Array for [T; 82][src]

type Item = T

type Maybe = [MaybeUninit<T>; 82]

impl<T> Array for [T; 83][src]

type Item = T

type Maybe = [MaybeUninit<T>; 83]

impl<T> Array for [T; 84][src]

type Item = T

type Maybe = [MaybeUninit<T>; 84]

impl<T> Array for [T; 85][src]

type Item = T

type Maybe = [MaybeUninit<T>; 85]

impl<T> Array for [T; 86][src]

type Item = T

type Maybe = [MaybeUninit<T>; 86]

impl<T> Array for [T; 87][src]

type Item = T

type Maybe = [MaybeUninit<T>; 87]

impl<T> Array for [T; 88][src]

type Item = T

type Maybe = [MaybeUninit<T>; 88]

impl<T> Array for [T; 89][src]

type Item = T

type Maybe = [MaybeUninit<T>; 89]

impl<T> Array for [T; 90][src]

type Item = T

type Maybe = [MaybeUninit<T>; 90]

impl<T> Array for [T; 91][src]

type Item = T

type Maybe = [MaybeUninit<T>; 91]

impl<T> Array for [T; 92][src]

type Item = T

type Maybe = [MaybeUninit<T>; 92]

impl<T> Array for [T; 93][src]

type Item = T

type Maybe = [MaybeUninit<T>; 93]

impl<T> Array for [T; 94][src]

type Item = T

type Maybe = [MaybeUninit<T>; 94]

impl<T> Array for [T; 95][src]

type Item = T

type Maybe = [MaybeUninit<T>; 95]

impl<T> Array for [T; 96][src]

type Item = T

type Maybe = [MaybeUninit<T>; 96]

impl<T> Array for [T; 97][src]

type Item = T

type Maybe = [MaybeUninit<T>; 97]

impl<T> Array for [T; 98][src]

type Item = T

type Maybe = [MaybeUninit<T>; 98]

impl<T> Array for [T; 99][src]

type Item = T

type Maybe = [MaybeUninit<T>; 99]

impl<T> Array for [T; 100][src]

type Item = T

type Maybe = [MaybeUninit<T>; 100]

impl<T> Array for [T; 101][src]

type Item = T

type Maybe = [MaybeUninit<T>; 101]

impl<T> Array for [T; 102][src]

type Item = T

type Maybe = [MaybeUninit<T>; 102]

impl<T> Array for [T; 103][src]

type Item = T

type Maybe = [MaybeUninit<T>; 103]

impl<T> Array for [T; 104][src]

type Item = T

type Maybe = [MaybeUninit<T>; 104]

impl<T> Array for [T; 105][src]

type Item = T

type Maybe = [MaybeUninit<T>; 105]

impl<T> Array for [T; 106][src]

type Item = T

type Maybe = [MaybeUninit<T>; 106]

impl<T> Array for [T; 107][src]

type Item = T

type Maybe = [MaybeUninit<T>; 107]

impl<T> Array for [T; 108][src]

type Item = T

type Maybe = [MaybeUninit<T>; 108]

impl<T> Array for [T; 109][src]

type Item = T

type Maybe = [MaybeUninit<T>; 109]

impl<T> Array for [T; 110][src]

type Item = T

type Maybe = [MaybeUninit<T>; 110]

impl<T> Array for [T; 111][src]

type Item = T

type Maybe = [MaybeUninit<T>; 111]

impl<T> Array for [T; 112][src]

type Item = T

type Maybe = [MaybeUninit<T>; 112]

impl<T> Array for [T; 113][src]

type Item = T

type Maybe = [MaybeUninit<T>; 113]

impl<T> Array for [T; 114][src]

type Item = T

type Maybe = [MaybeUninit<T>; 114]

impl<T> Array for [T; 115][src]

type Item = T

type Maybe = [MaybeUninit<T>; 115]

impl<T> Array for [T; 116][src]

type Item = T

type Maybe = [MaybeUninit<T>; 116]

impl<T> Array for [T; 117][src]

type Item = T

type Maybe = [MaybeUninit<T>; 117]

impl<T> Array for [T; 118][src]

type Item = T

type Maybe = [MaybeUninit<T>; 118]

impl<T> Array for [T; 119][src]

type Item = T

type Maybe = [MaybeUninit<T>; 119]

impl<T> Array for [T; 120][src]

type Item = T

type Maybe = [MaybeUninit<T>; 120]

impl<T> Array for [T; 121][src]

type Item = T

type Maybe = [MaybeUninit<T>; 121]

impl<T> Array for [T; 122][src]

type Item = T

type Maybe = [MaybeUninit<T>; 122]

impl<T> Array for [T; 123][src]

type Item = T

type Maybe = [MaybeUninit<T>; 123]

impl<T> Array for [T; 124][src]

type Item = T

type Maybe = [MaybeUninit<T>; 124]

impl<T> Array for [T; 125][src]

type Item = T

type Maybe = [MaybeUninit<T>; 125]

impl<T> Array for [T; 126][src]

type Item = T

type Maybe = [MaybeUninit<T>; 126]

impl<T> Array for [T; 127][src]

type Item = T

type Maybe = [MaybeUninit<T>; 127]

impl<T> Array for [T; 128][src]

type Item = T

type Maybe = [MaybeUninit<T>; 128]

impl<T> Array for [T; 200][src]

type Item = T

type Maybe = [MaybeUninit<T>; 200]

impl<T> Array for [T; 256][src]

type Item = T

type Maybe = [MaybeUninit<T>; 256]

impl<T> Array for [T; 300][src]

type Item = T

type Maybe = [MaybeUninit<T>; 300]

impl<T> Array for [T; 400][src]

type Item = T

type Maybe = [MaybeUninit<T>; 400]

impl<T> Array for [T; 500][src]

type Item = T

type Maybe = [MaybeUninit<T>; 500]

impl<T> Array for [T; 512][src]

type Item = T

type Maybe = [MaybeUninit<T>; 512]

impl<T> Array for [T; 600][src]

type Item = T

type Maybe = [MaybeUninit<T>; 600]

impl<T> Array for [T; 700][src]

type Item = T

type Maybe = [MaybeUninit<T>; 700]

impl<T> Array for [T; 800][src]

type Item = T

type Maybe = [MaybeUninit<T>; 800]

impl<T> Array for [T; 900][src]

type Item = T

type Maybe = [MaybeUninit<T>; 900]

impl<T> Array for [T; 1000][src]

type Item = T

type Maybe = [MaybeUninit<T>; 1000]

impl<T> Array for [T; 1024][src]

type Item = T

type Maybe = [MaybeUninit<T>; 1024]

impl<T> Array for [T; 2048][src]

type Item = T

type Maybe = [MaybeUninit<T>; 2048]

impl<T> Array for [T; 4096][src]

type Item = T

type Maybe = [MaybeUninit<T>; 4096]

impl<T> Array for [T; 8192][src]

type Item = T

type Maybe = [MaybeUninit<T>; 8192]

impl<T> Array for [T; 16384][src]

type Item = T

type Maybe = [MaybeUninit<T>; 16384]

impl<T> Array for [T; 32768][src]

type Item = T

type Maybe = [MaybeUninit<T>; 32768]

impl<T> Array for [T; 65536][src]

type Item = T

type Maybe = [MaybeUninit<T>; 65536]

Loading content...