Skip to main content

grafix_toolbox/kit/policies/math/cast/
tuples.rs

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);