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