cl_aux/structures/
array_wrapper_ref.rs1use core::{borrow::Borrow, ops::Deref, slice::Iter};
2
3#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
5#[repr(transparent)]
6pub struct ArrayWrapperRef<'array, T, const N: usize>(
7 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}