1use crate::base::{DimName, Scalar, ToTypenum, Vector, Vector2, Vector3};
2use crate::storage::RawStorage;
3use typenum::{self, Cmp, Greater};
4
5macro_rules! impl_swizzle {
6 ($( where $BaseDim: ident: $( $name: ident() -> $Result: ident[$($i: expr),+] ),+ ;)* ) => {
7 $(
8 $(
9 #[inline]
11 #[must_use]
12 pub fn $name(&self) -> $Result<T>
13 where D::Typenum: Cmp<typenum::$BaseDim, Output=Greater> {
14 $Result::new($(self[$i].clone()),*)
15 }
16 )*
17 )*
18 }
19}
20
21impl<T: Scalar, D, S: RawStorage<T, D>> Vector<T, D, S>
23where
24 D: DimName + ToTypenum,
25{
26 impl_swizzle!(
27 where U0: xx() -> Vector2[0, 0],
28 xxx() -> Vector3[0, 0, 0];
29
30 where U1: xy() -> Vector2[0, 1],
31 yx() -> Vector2[1, 0],
32 yy() -> Vector2[1, 1],
33 xxy() -> Vector3[0, 0, 1],
34 xyx() -> Vector3[0, 1, 0],
35 xyy() -> Vector3[0, 1, 1],
36 yxx() -> Vector3[1, 0, 0],
37 yxy() -> Vector3[1, 0, 1],
38 yyx() -> Vector3[1, 1, 0],
39 yyy() -> Vector3[1, 1, 1];
40
41 where U2: xz() -> Vector2[0, 2],
42 yz() -> Vector2[1, 2],
43 zx() -> Vector2[2, 0],
44 zy() -> Vector2[2, 1],
45 zz() -> Vector2[2, 2],
46 xxz() -> Vector3[0, 0, 2],
47 xyz() -> Vector3[0, 1, 2],
48 xzx() -> Vector3[0, 2, 0],
49 xzy() -> Vector3[0, 2, 1],
50 xzz() -> Vector3[0, 2, 2],
51 yxz() -> Vector3[1, 0, 2],
52 yyz() -> Vector3[1, 1, 2],
53 yzx() -> Vector3[1, 2, 0],
54 yzy() -> Vector3[1, 2, 1],
55 yzz() -> Vector3[1, 2, 2],
56 zxx() -> Vector3[2, 0, 0],
57 zxy() -> Vector3[2, 0, 1],
58 zxz() -> Vector3[2, 0, 2],
59 zyx() -> Vector3[2, 1, 0],
60 zyy() -> Vector3[2, 1, 1],
61 zyz() -> Vector3[2, 1, 2],
62 zzx() -> Vector3[2, 2, 0],
63 zzy() -> Vector3[2, 2, 1],
64 zzz() -> Vector3[2, 2, 2];
65 );
66}