1 /// A trait for types that are an array. 2 /// 3 /// An "array", for our purposes, has the following properties: 4 /// * Owns some number of elements. 5 /// * The element type can be generic, but must implement [`Default`]. 6 /// * The capacity is fixed at compile time, based on the implementing type. 7 /// * You can get a shared or mutable slice to the elements. 8 /// 9 /// You are generally **not** expected to need to implement this yourself. It is 10 /// already implemented for all the major array lengths (`0..=32` and the powers 11 /// of 2 up to 4,096), or for all array lengths with the feature `rustc_1_55`. 12 /// 13 /// **Additional lengths can easily be added upon request.** 14 /// 15 /// ## Safety Reminder 16 /// 17 /// Just a reminder: this trait is 100% safe, which means that `unsafe` code 18 /// **must not** rely on an instance of this trait being correct. 19 pub trait Array { 20 /// The type of the items in the thing. 21 type Item: Default; 22 23 /// The number of slots in the thing. 24 const CAPACITY: usize; 25 26 /// Gives a shared slice over the whole thing. 27 /// 28 /// A correct implementation will return a slice with a length equal to the 29 /// `CAPACITY` value. as_slice(&self) -> &[Self::Item]30 fn as_slice(&self) -> &[Self::Item]; 31 32 /// Gives a unique slice over the whole thing. 33 /// 34 /// A correct implementation will return a slice with a length equal to the 35 /// `CAPACITY` value. as_slice_mut(&mut self) -> &mut [Self::Item]36 fn as_slice_mut(&mut self) -> &mut [Self::Item]; 37 38 /// Create a default-initialized instance of ourself, similar to the 39 /// [`Default`] trait, but implemented for the same range of sizes as 40 /// [`Array`]. default() -> Self41 fn default() -> Self; 42 } 43 44 #[cfg(feature = "rustc_1_55")] 45 mod const_generic_impl; 46 47 #[cfg(not(feature = "rustc_1_55"))] 48 mod generated_impl; 49