1use {crate::lib::*, Copy as P};
2
3impl<A, B, T1, T2> Cast<(A, B)> for (T1, T2)
4where
5 T1: Cast<A>,
6 T2: Cast<B>,
7{
8 #[inline(always)]
9 fn to((a, b): (A, B)) -> Self {
10 (T1::to(a), T2::to(b))
11 }
12}
13impl<T: P, T1, T2> Cast<&T> for (T1, T2)
14where
15 Self: Cast<T>,
16{
17 #[inline(always)]
18 fn to(t: &T) -> Self {
19 Self::to(*t)
20 }
21}
22impl<T: P, T1, T2> Cast<&mut T> for (T1, T2)
23where
24 Self: Cast<T>,
25{
26 #[inline(always)]
27 fn to(t: &mut T) -> Self {
28 Self::to(*t)
29 }
30}
31macro_rules! impl_tuple2 {
32 ($($f: ty),+) => {
33 $(impl<T1, T2> Cast<$f> for (T1, T2)
34 where
35 T1: Cast<$f>,
36 T2: Cast<$f>,
37 {
38 #[inline(always)]
39 fn to(v: $f) -> Self {
40 Self::to((v, v))
41 }
42 })+
43 };
44}
45impl_tuple2!(bool, u8, i8, u16, i16, u32, i32, u64, i64, u128, i128, f16, f32, f64, usize, isize);
46
47impl<A, B, C, T1, T2, T3> Cast<(A, B, C)> for (T1, T2, T3)
48where
49 T1: Cast<A>,
50 T2: Cast<B>,
51 T3: Cast<C>,
52{
53 #[inline(always)]
54 fn to((a, b, c): (A, B, C)) -> Self {
55 (T1::to(a), T2::to(b), T3::to(c))
56 }
57}
58impl<T: P, T1, T2, T3> Cast<&T> for (T1, T2, T3)
59where
60 Self: Cast<T>,
61{
62 #[inline(always)]
63 fn to(t: &T) -> Self {
64 Self::to(*t)
65 }
66}
67impl<T: P, T1, T2, T3> Cast<&mut T> for (T1, T2, T3)
68where
69 Self: Cast<T>,
70{
71 #[inline(always)]
72 fn to(t: &mut T) -> Self {
73 Self::to(*t)
74 }
75}
76macro_rules! impl_tuple3 {
77 ($($f: ty),+) => {
78 $(impl<T1, T2, T3> Cast<$f> for (T1, T2, T3)
79 where
80 T1: Cast<$f>,
81 T2: Cast<$f>,
82 T3: Cast<$f>,
83 {
84 #[inline(always)]
85 fn to(v: $f) -> Self {
86 Self::to((v, v, v))
87 }
88 })+
89 };
90}
91impl_tuple3!(bool, u8, i8, u16, i16, u32, i32, u64, i64, u128, i128, f16, f32, f64, usize, isize);
92
93impl<A, B, C, D, T1, T2, T3, T4> Cast<(A, B, C, D)> for (T1, T2, T3, T4)
94where
95 T1: Cast<A>,
96 T2: Cast<B>,
97 T3: Cast<C>,
98 T4: Cast<D>,
99{
100 #[inline(always)]
101 fn to((a, b, c, d): (A, B, C, D)) -> Self {
102 (T1::to(a), T2::to(b), T3::to(c), T4::to(d))
103 }
104}
105impl<T: P, T1, T2, T3, T4> Cast<&T> for (T1, T2, T3, T4)
106where
107 Self: Cast<T>,
108{
109 #[inline(always)]
110 fn to(t: &T) -> Self {
111 Self::to(*t)
112 }
113}
114impl<T: P, T1, T2, T3, T4> Cast<&mut T> for (T1, T2, T3, T4)
115where
116 Self: Cast<T>,
117{
118 #[inline(always)]
119 fn to(t: &mut T) -> Self {
120 Self::to(*t)
121 }
122}
123macro_rules! impl_tuple4 {
124 ($($f: ty),+) => {
125 $(impl<T1, T2, T3, T4> Cast<$f> for (T1, T2, T3, T4)
126 where
127 T1: Cast<$f>,
128 T2: Cast<$f>,
129 T3: Cast<$f>,
130 T4: Cast<$f>,
131 {
132 #[inline(always)]
133 fn to(v: $f) -> Self {
134 Self::to((v, v, v, v))
135 }
136 })+
137 };
138}
139impl_tuple4!(bool, u8, i8, u16, i16, u32, i32, u64, i64, u128, i128, f16, f32, f64, usize, isize);
140
141impl<T> Cast<vec4<T>> for vec3<T> {
142 #[inline(always)]
143 fn to((v1, v2, v3, _): vec4<T>) -> Self {
144 (v1, v2, v3)
145 }
146}
147impl<T> Cast<vec4<T>> for vec2<T> {
148 #[inline(always)]
149 fn to((v1, v2, ..): vec4<T>) -> Self {
150 (v1, v2)
151 }
152}
153impl<T> Cast<vec3<T>> for vec2<T> {
154 #[inline(always)]
155 fn to((v1, v2, _): vec3<T>) -> Self {
156 (v1, v2)
157 }
158}
159
160impl<T: Copy> Cast<&[T]> for vec2<T> {
161 #[inline(always)]
162 fn to(v: &[T]) -> Self {
163 ASSERT!(v.len() == 2, "Vec2 cast from [_][..{}]", v.len());
164 (*v.at(0), *v.at(1))
165 }
166}
167impl<T: Copy> Cast<&[T]> for vec3<T> {
168 #[inline(always)]
169 fn to(v: &[T]) -> Self {
170 ASSERT!(v.len() == 3, "Vec3 cast from [_][..{}]", v.len());
171 (*v.at(0), *v.at(1), *v.at(2))
172 }
173}
174impl<T: Copy> Cast<&[T]> for vec4<T> {
175 #[inline(always)]
176 fn to(v: &[T]) -> Self {
177 ASSERT!(v.len() == 4, "Vec4 cast from [_][..{}]", v.len());
178 (*v.at(0), *v.at(1), *v.at(2), *v.at(3))
179 }
180}
181
182macro_rules! impl_arr {
183 ($to: ident, $dim: literal) => {
184 impl<T, A> Cast<A> for [T; $dim]
185 where
186 $to<T>: Cast<A>,
187 {
188 #[inline(always)]
189 fn to(v: A) -> Self {
190 $to::to(v).into()
191 }
192 }
193 impl<T, A> Cast<[A; $dim]> for $to<T>
194 where
195 T: Cast<A>,
196 {
197 #[inline(always)]
198 fn to(v: [A; $dim]) -> Self {
199 Self::to($to::<A>::from(v))
200 }
201 }
202 };
203}
204impl_arr!(vec2, 2);
205impl_arr!(vec3, 3);
206impl_arr!(vec4, 4);