| 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.
|
| 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.
|
| 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`].
|
| 41 | 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 | |