1pub trait ToArray<T, const N: usize>: Into<[T; N]>
2{
3 #[inline(always)]
4 fn to_array(self) -> [T; N] { self.into() }
5}
6impl<C, T, const N: usize> ToArray<T, N> for C where C: Into<[T; N]> {}
7
8pub trait FromArray<T, const N: usize>: From<[T; N]>
9{
10 #[inline(always)]
11 fn from_array(value: [T; N]) -> Self { value.into() }
12 fn from_fn<F>(f: F) -> Self
13 where
14 F: FnMut(usize) -> T,
15 {
16 Self::from_array(std::array::from_fn(f))
17 }
18 fn splat(val: T) -> Self
19 where
20 T: Clone,
21 {
22 Self::from_fn(|_| val.clone())
23 }
24}
25impl<C, T, const N: usize> FromArray<T, N> for C where C: From<[T; N]> {}
26
27pub trait AsArray<T, const N: usize>: AsRef<[T; N]>
28{
29 #[inline(always)]
30 fn as_array(&self) -> &[T; N] { self.as_ref() }
31}
32impl<C, T, const N: usize> AsArray<T, N> for C where C: AsRef<[T; N]> {}
33
34pub trait AsArrayMut<T, const N: usize>: AsMut<[T; N]>
35{
36 #[inline(always)]
37 fn as_array_mut(&mut self) -> &mut [T; N] { self.as_mut() }
38}
39impl<C, T, const N: usize> AsArrayMut<T, N> for C where C: AsMut<[T; N]> {}
40
41pub trait AsSlice<T>: AsRef<[T]>
42{
43 #[inline(always)]
44 fn as_slice(&self) -> &[T] { self.as_ref() }
45}
46impl<C, T> AsSlice<T> for C where C: AsRef<[T]> {}
47
48pub trait AsMutSlice<T>: AsMut<[T]>
49{
50 #[inline(always)]
51 fn as_mut_slice(&mut self) -> &mut [T] { self.as_mut() }
52}
53impl<C, T> AsMutSlice<T> for C where C: AsMut<[T]> {}
54
55pub trait ToArray1<T>: Into<[T; 1]>
56{
57 #[inline(always)]
58 fn to_array1(self) -> [T; 1] { self.into() }
59}
60impl<C, T> ToArray1<T> for C where C: Into<[T; 1]> {}
61
62pub trait ToArray2<T>: Into<[T; 2]>
63{
64 #[inline(always)]
65 fn to_array2(self) -> [T; 2] { self.into() }
66}
67impl<C, T> ToArray2<T> for C where C: Into<[T; 2]> {}
68
69pub trait ToArray3<T>: Into<[T; 3]>
70{
71 #[inline(always)]
72 fn to_array3(self) -> [T; 3] { self.into() }
73}
74impl<C, T> ToArray3<T> for C where C: Into<[T; 3]> {}
75
76pub trait ToArray4<T>: Into<[T; 4]>
77{
78 #[inline(always)]
79 fn to_array4(self) -> [T; 4] { self.into() }
80}
81impl<C, T> ToArray4<T> for C where C: Into<[T; 4]> {}
82
83pub trait ToArray5<T>: Into<[T; 5]>
84{
85 #[inline(always)]
86 fn to_array5(self) -> [T; 5] { self.into() }
87}
88impl<C, T> ToArray5<T> for C where C: Into<[T; 5]> {}
89
90pub trait ToArray6<T>: Into<[T; 6]>
91{
92 #[inline(always)]
93 fn to_array6(self) -> [T; 6] { self.into() }
94}
95impl<C, T> ToArray6<T> for C where C: Into<[T; 6]> {}
96
97pub trait ToArray7<T>: Into<[T; 7]>
98{
99 #[inline(always)]
100 fn to_array7(self) -> [T; 7] { self.into() }
101}
102impl<C, T> ToArray7<T> for C where C: Into<[T; 7]> {}
103
104pub trait ToArray8<T>: Into<[T; 8]>
105{
106 #[inline(always)]
107 fn to_array8(self) -> [T; 8] { self.into() }
108}
109impl<C, T> ToArray8<T> for C where C: Into<[T; 8]> {}
110
111pub trait ArrayToTuple
112{
113 type Tuple;
114 fn to_tuple(self) -> Self::Tuple;
115 fn from_tuple(value: Self::Tuple) -> Self;
116}
117
118impl<T> ArrayToTuple for [T; 0]
119{
120 type Tuple = ();
121 fn to_tuple(self) -> Self::Tuple {}
122 fn from_tuple(_: Self::Tuple) -> Self { [] }
123}
124
125impl<T> ArrayToTuple for [T; 1]
126{
127 type Tuple = (T,);
128 fn to_tuple(self) -> Self::Tuple
129 {
130 let [a] = self;
131 (a,)
132 }
133 fn from_tuple(t: Self::Tuple) -> Self { [t.0] }
134}
135
136impl<T> ArrayToTuple for [T; 2]
137{
138 type Tuple = (T, T);
139 fn to_tuple(self) -> Self::Tuple
140 {
141 let [a, b] = self;
142 (a, b)
143 }
144 fn from_tuple(t: Self::Tuple) -> Self { [t.0, t.1] }
145}
146
147impl<T> ArrayToTuple for [T; 3]
148{
149 type Tuple = (T, T, T);
150 fn to_tuple(self) -> Self::Tuple
151 {
152 let [a, b, c] = self;
153 (a, b, c)
154 }
155 fn from_tuple(t: Self::Tuple) -> Self { [t.0, t.1, t.2] }
156}
157
158impl<T> ArrayToTuple for [T; 4]
159{
160 type Tuple = (T, T, T, T);
161 fn to_tuple(self) -> Self::Tuple
162 {
163 let [a, b, c, d] = self;
164 (a, b, c, d)
165 }
166 fn from_tuple(t: Self::Tuple) -> Self { [t.0, t.1, t.2, t.3] }
167}
168
169impl<T> ArrayToTuple for [T; 5]
170{
171 type Tuple = (T, T, T, T, T);
172 fn to_tuple(self) -> Self::Tuple
173 {
174 let [a, b, c, d, e] = self;
175 (a, b, c, d, e)
176 }
177 fn from_tuple(t: Self::Tuple) -> Self { [t.0, t.1, t.2, t.3, t.4] }
178}
179
180impl<T> ArrayToTuple for [T; 6]
181{
182 type Tuple = (T, T, T, T, T, T);
183 fn to_tuple(self) -> Self::Tuple
184 {
185 let [a, b, c, d, e, f] = self;
186 (a, b, c, d, e, f)
187 }
188 fn from_tuple(t: Self::Tuple) -> Self { [t.0, t.1, t.2, t.3, t.4, t.5] }
189}
190
191impl<T> ArrayToTuple for [T; 7]
192{
193 type Tuple = (T, T, T, T, T, T, T);
194 fn to_tuple(self) -> Self::Tuple
195 {
196 let [a, b, c, d, e, f, g] = self;
197 (a, b, c, d, e, f, g)
198 }
199 fn from_tuple(t: Self::Tuple) -> Self { [t.0, t.1, t.2, t.3, t.4, t.5, t.6] }
200}
201
202impl<T> ArrayToTuple for [T; 8]
203{
204 type Tuple = (T, T, T, T, T, T, T, T);
205 fn to_tuple(self) -> Self::Tuple
206 {
207 let [a, b, c, d, e, f, g, h] = self;
208 (a, b, c, d, e, f, g, h)
209 }
210 fn from_tuple(t: Self::Tuple) -> Self { [t.0, t.1, t.2, t.3, t.4, t.5, t.6, t.7] }
211}