     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48

    /// 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).
    ///
    /// **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 = "nightly_const_generics")]
    mod const_generic_impl;

    #[cfg(not(feature = "nightly_const_generics"))]
    mod generated_impl;