Crate slice_as_array

Source
Expand description

This crate provides macros to convert from slices, which have lengths that are stored and checked at runtime, into arrays, which have lengths known at compile time. This can make types more expressive (e.g. &[u8; 32] instead of &[u8]) and helps the compiler omit bounds checks.

slice_as_array!(xs, [u32; 4]) returns Some(&[u32; 4]) if xs was a slice of length 4, or None otherwise.

slice_as_array_mut!(ys, [String; 7]) returns Some(&mut [String; 7]) if ys was a slice of length 7, or None otherwise.

slice_to_array_clone!(zs, [String; 4] returns Some([String; 4]) if zs was a slice of length 4, or `None otherwise. The passed-in slice remains intact and its elements are cloned.

For most users, stating a dependency on this is simply:

โ“˜
[dependencies]
slice_as_array "1.1.0"

To support being called from a #![no_std] crate, this crate has a feature named with_std that is on by default. A #![no_std] crate should use:

โ“˜
[dependencies]
slice_as_array = { version = "1.1.0", default-features = false }

Example usage:

โ“˜
#[macro_use] extern crate slice_as_array;

fn slice_as_hash(xs: &[u8]) -> &[u8; 32] {
    slice_as_array!(xs, [u8; 32]).expect("bad hash length")
}

fn mutate_chunk(xs: &mut [u32; 10]) {
    // ...
}

fn mutate_chunks(xs: &mut [u32; 100]) {
    for chunk in xs.chunks_mut(10).map(|c| slice_as_array_mut!(c, [u32; 10]).unwrap() ) {
        mutate_chunk(chunk)
    }
}

Macrosยง

slice_as_array
Convert a slice to an array. slice_as_array!(slice, [element_type; array_length]) -> Option<&[element_type; array_length]>
slice_as_array_mut
Convert a mutable slice to a mutable array. slice_as_array_mut!(mutable_slice, [element_type; array_length]) -> Option<&mut [element_type; array_length]>
slice_to_array_clone
Convert a slice to an array by cloning each element. slice_to_array_clone!(slice, [element_type; array_length]) -> Option<[element_type; array_length]>