/// A trait for types that are an array. /// /// An "array", for our purposes, has the following properties: /// * Owns some number of elements. /// * The element type can be generic, but must implement [`Default`]. /// * The capacity is fixed at compile time, based on the implementing type. /// * You can get a shared or mutable slice to the elements. /// /// You are generally **not** expected to need to implement this yourself. It is /// already implemented for all the major array lengths (`0..=32` and the powers /// of 2 up to 4,096), or for all array lengths with the feature `rustc_1_55`. /// /// **Additional lengths can easily be added upon request.** /// /// ## Safety Reminder /// /// Just a reminder: this trait is 100% safe, which means that `unsafe` code /// **must not** rely on an instance of this trait being correct. pub trait Array { /// The type of the items in the thing. type Item: Default; /// The number of slots in the thing. const CAPACITY: usize; /// Gives a shared slice over the whole thing. /// /// A correct implementation will return a slice with a length equal to the /// `CAPACITY` value. fn as_slice(&self) -> &[Self::Item]; /// Gives a unique slice over the whole thing. /// /// A correct implementation will return a slice with a length equal to the /// `CAPACITY` value. fn as_slice_mut(&mut self) -> &mut [Self::Item]; /// Create a default-initialized instance of ourself, similar to the /// [`Default`] trait, but implemented for the same range of sizes as /// [`Array`]. fn default() -> Self; } #[cfg(feature = "rustc_1_55")] mod const_generic_impl; #[cfg(not(feature = "rustc_1_55"))] mod generated_impl;