cl_aux/structures/
array_wrapper_ref.rs

1use core::{borrow::Borrow, ops::Deref, slice::Iter};
2
3/// Immutable array reference wrapper similar to [`crate::ArrayWrapper`].
4#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
5#[repr(transparent)]
6pub struct ArrayWrapperRef<'array, T, const N: usize>(
7  /// The actual array reference.
8  pub &'array [T; N],
9);
10
11impl<T, const N: usize> AsRef<[T; N]> for ArrayWrapperRef<'_, T, N> {
12  #[inline]
13  fn as_ref(&self) -> &[T; N] {
14    self
15  }
16}
17
18impl<T, const N: usize> Borrow<[T; N]> for ArrayWrapperRef<'_, T, N> {
19  #[inline]
20  fn borrow(&self) -> &[T; N] {
21    self
22  }
23}
24
25impl<T, const N: usize> Deref for ArrayWrapperRef<'_, T, N> {
26  type Target = [T; N];
27
28  #[inline]
29  fn deref(&self) -> &[T; N] {
30    self.0
31  }
32}
33
34impl<'array, T, const N: usize> From<&'array [T; N]> for ArrayWrapperRef<'array, T, N> {
35  #[inline]
36  fn from(from: &'array [T; N]) -> Self {
37    Self(from)
38  }
39}
40
41impl<'array, T, const N: usize> IntoIterator for &'array ArrayWrapperRef<'array, T, N> {
42  type IntoIter = Iter<'array, T>;
43  type Item = &'array T;
44
45  #[inline]
46  fn into_iter(self) -> Self::IntoIter {
47    self.0.iter()
48  }
49}
50
51#[cfg(feature = "serde")]
52mod serde {
53  use crate::ArrayWrapperRef;
54  use serde::{ser::SerializeTuple as _, Serialize, Serializer};
55
56  impl<T, const N: usize> Serialize for ArrayWrapperRef<'_, T, N>
57  where
58    T: Serialize,
59  {
60    #[inline]
61    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
62    where
63      S: Serializer,
64    {
65      let mut seq = serializer.serialize_tuple(N)?;
66      for elem in self.0 {
67        seq.serialize_element(elem)?;
68      }
69      seq.end()
70    }
71  }
72}