nalgebra/geometry/
quaternion_simba.rs
1use simba::simd::SimdValue;
2
3use crate::base::Vector4;
4use crate::geometry::{Quaternion, UnitQuaternion};
5use crate::Scalar;
6
7impl<T: Scalar + SimdValue> SimdValue for Quaternion<T>
8where
9 T::Element: Scalar,
10{
11 type Element = Quaternion<T::Element>;
12 type SimdBool = T::SimdBool;
13
14 #[inline]
15 fn lanes() -> usize {
16 T::lanes()
17 }
18
19 #[inline]
20 fn splat(val: Self::Element) -> Self {
21 Vector4::splat(val.coords).into()
22 }
23
24 #[inline]
25 fn extract(&self, i: usize) -> Self::Element {
26 self.coords.extract(i).into()
27 }
28
29 #[inline]
30 unsafe fn extract_unchecked(&self, i: usize) -> Self::Element {
31 self.coords.extract_unchecked(i).into()
32 }
33
34 #[inline]
35 fn replace(&mut self, i: usize, val: Self::Element) {
36 self.coords.replace(i, val.coords)
37 }
38
39 #[inline]
40 unsafe fn replace_unchecked(&mut self, i: usize, val: Self::Element) {
41 self.coords.replace_unchecked(i, val.coords)
42 }
43
44 #[inline]
45 fn select(self, cond: Self::SimdBool, other: Self) -> Self {
46 self.coords.select(cond, other.coords).into()
47 }
48}
49
50impl<T: Scalar + SimdValue> SimdValue for UnitQuaternion<T>
51where
52 T::Element: Scalar,
53{
54 type Element = UnitQuaternion<T::Element>;
55 type SimdBool = T::SimdBool;
56
57 #[inline]
58 fn lanes() -> usize {
59 T::lanes()
60 }
61
62 #[inline]
63 fn splat(val: Self::Element) -> Self {
64 UnitQuaternion::new_unchecked(Quaternion::splat(val.into_inner()))
65 }
66
67 #[inline]
68 fn extract(&self, i: usize) -> Self::Element {
69 UnitQuaternion::new_unchecked(self.as_ref().extract(i))
70 }
71
72 #[inline]
73 unsafe fn extract_unchecked(&self, i: usize) -> Self::Element {
74 UnitQuaternion::new_unchecked(self.as_ref().extract_unchecked(i))
75 }
76
77 #[inline]
78 fn replace(&mut self, i: usize, val: Self::Element) {
79 self.as_mut_unchecked().replace(i, val.into_inner())
80 }
81
82 #[inline]
83 unsafe fn replace_unchecked(&mut self, i: usize, val: Self::Element) {
84 self.as_mut_unchecked()
85 .replace_unchecked(i, val.into_inner())
86 }
87
88 #[inline]
89 fn select(self, cond: Self::SimdBool, other: Self) -> Self {
90 UnitQuaternion::new_unchecked(self.into_inner().select(cond, other.into_inner()))
91 }
92}