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 | |