50 releases (5 stable)

new 1.2.0 Jan 12, 2025
1.1.1 Nov 25, 2024
1.1.0 Jul 5, 2024
1.0.0 Sep 13, 2023
0.0.3 Nov 1, 2015

#15 in Data structures

Download history 2151869/week @ 2024-09-23 2485594/week @ 2024-09-30 2842175/week @ 2024-10-07 2744803/week @ 2024-10-14 2358533/week @ 2024-10-21 2168094/week @ 2024-10-28 2185046/week @ 2024-11-04 2196534/week @ 2024-11-11 2233312/week @ 2024-11-18 1936833/week @ 2024-11-25 2243541/week @ 2024-12-02 2779172/week @ 2024-12-09 2180389/week @ 2024-12-16 1126587/week @ 2024-12-23 1333229/week @ 2024-12-30 2158894/week @ 2025-01-06

6,925,642 downloads per month
Used in 27,968 crates (428 directly)

MIT license

110KB
2K SLoC

Crates.io Build Status

generic-array

This crate implements a structure that can be used as a generic array type.

**Requires minimum Rust version of 1.83.0

Documentation on GH Pages may be required to view certain types on foreign crates.

Usage

Before Rust 1.51, arrays [T; N] were problematic in that they couldn't be generic with respect to the length N, so this wouldn't work:

struct Foo<N> {
    data: [i32; N],
}

Since 1.51, the below syntax is valid:

struct Foo<const N: usize> {
    data: [i32; N],
}

However, the const-generics we have as of writing this are still the minimum-viable product (min_const_generics), so many situations still result in errors, such as this example:

trait Bar {
    const LEN: usize;

    // Error: cannot perform const operation using `Self`
    fn bar(&self) -> Foo<{ Self::LEN }>;
}

generic-array defines a new trait ArrayLength and a struct GenericArray<T, N: ArrayLength>, which lets the above be implemented as:

struct Foo<N: ArrayLength> {
    data: GenericArray<i32, N>
}

trait Bar {
    type LEN: ArrayLength;
    fn bar(&self) -> Foo<Self::LEN>;
}

The ArrayLength trait is implemented for unsigned integer types from typenum crate. For example, GenericArray<T, U5> would work almost like [T; 5]:

use generic_array::typenum::U5;

struct Foo<T, N: ArrayLength> {
    data: GenericArray<T, N>
}

let foo = Foo::<i32, U5> { data: GenericArray::default() };

The arr! macro is provided to allow easier creation of literal arrays, as shown below:

let array = arr![1, 2, 3];
//  array: GenericArray<i32, typenum::U3>
assert_eq!(array[2], 3);

Feature flags

[dependencies.generic-array]
features = [
    "serde",         # Serialize/Deserialize implementation
    "zeroize",       # Zeroize implementation for setting array elements to zero
    "const-default", # Compile-time const default value support via trait
    "alloc",         # Enables From/TryFrom implementations between GenericArray and Vec<T>/Box<[T]>
    "faster-hex"     # Enables internal use of the `faster-hex` crate for faster hex encoding via SIMD
]

Dependencies

~120–410KB
~10K SLoC