Skip to main content

hexga_array/
extension.rs

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}