![Docs badge] ![crates badge] ![github badge] ![license badge]
Utilities for working with uninitialized arrays
This crate provides a few sets of APIs:
uninit_buf
and mark_initialized
These are a pair of functions which are generally used as follows:
- stack-allocate an uninitialized array with uninit_buf
- initialize each element
- unsafely convert it to an initialized array with mark_initialized
For example: ```rust use unarray::*;
fn main() {
let mut buffer = uninit_buf::
for slot in &mut buffer { slot.write(123); }
let array = unsafe { mark_initialized(buffer) };
assert_eq!(array, [123; 10]); } ```
This is simple to understand, but still requires unsafe
, which is hard to justify in many cases
build_array_*
Functions to build arrays from a length and a function that maps from index -> value: ```rust let evennumbers = buildarray(|i| i * 2); // const generic length parameter inferred asserteq!(evennumbers, [0, 2, 4]);
let numbers = buildarrayoption::
let numbers = buildarrayoption::
There is also an equivalent
buildarrayresultfor
Result`-returning functions
It's fairly common to want to collect an iterator into an array, but this is currently tricky in
stable Rust, since iterators don't carry compile-time information about their length. Because of this,
arrays don't implement FromIterator
, which is required for .collect()
to work.
Instead, this library provides ArrayFromIter
, which does implement FromIterator
. This struct can
be destructured to get an Option<[T, N]>
. If the iterator contained exactly N
elements, this is Some(array)
, otherwise, it is None
:
rust
let iter = [1, 2, 3].into_iter();
match iter.collect() {
ArrayFromIter(Some([a, b, c])) => println!("exactly 3 elements: {a}, {b}, {c}"),
ArrayFromIter(None) => println!("not 3 elements"),
}
UnarrayArrayExt
extension trait``rust
// mapping an array via a
Result`
let strings = ["123", "234"];
let numbers = strings.mapresult(|s| s.parse());
asserteq!(numbers, Ok([123, 234]));
let badstrings = ["123", "uh oh"];
let result = badstrings.mapresult(|s| s.parse::
There is also
map_optionfor functions which return an
Option`
Licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.