Crate sized_vec

source ·
Expand description

Type Level Sized Vectors

This crate provides a Vec<N, A> type, which wraps the standard Vec<A> and tracks its size N at the type level.

Because the size is embedded in the type, we can do things like verifying at compile time that index lookups are within bounds.

let vec = svec![1, 2, 3];
// This index lookup won't compile, because index `U8` is outside
// the vector's length of `U3`:
assert_eq!(5, vec[U8::new()]);
let vec = svec![1, 2, 3];
// On the other hand, this lookup can be verified to be correct
// by the type system:
assert_eq!(3, vec[U2::new()]);

Limitations

If this looks too good to be true, it’s because it comes with a number of limitations: you won’t be able to perform operations on the vector which could leave it with a length that can’t be known at compile time. This includes Extend::extend() and filtering operations like Vec::retain().

FromIterator::from_iter is, notably, also not available, but you can use Vec::try_from as a replacement. Note that try_from needs to be able to infer the size of the resulting vector at compile time; there’s no way to construct a vector of arbitrary length.

let vec = svec![1, 2, 3, 4, 5];
let new_vec = Vec::try_from(vec.into_iter().map(|i| i + 10));
assert_eq!(Some(svec![11, 12, 13, 14, 15]), new_vec);

Macros

Structs

A type level range.
A vector of length N containing elements of type A.

Traits