1 | use crate::simd::{LaneCount, Mask, MaskElement, Simd, SimdElement, SupportedLaneCount}; |
2 | |
3 | impl<T, const N: usize> Mask<T, N> |
4 | where |
5 | T: MaskElement, |
6 | LaneCount<N>: SupportedLaneCount, |
7 | { |
8 | /// Choose elements from two vectors. |
9 | /// |
10 | /// For each element in the mask, choose the corresponding element from `true_values` if |
11 | /// that element mask is true, and `false_values` if that element mask is false. |
12 | /// |
13 | /// # Examples |
14 | /// ``` |
15 | /// # #![feature (portable_simd)] |
16 | /// # use core::simd::{Simd, Mask}; |
17 | /// let a = Simd::from_array([0, 1, 2, 3]); |
18 | /// let b = Simd::from_array([4, 5, 6, 7]); |
19 | /// let mask = Mask::from_array([true, false, false, true]); |
20 | /// let c = mask.select(a, b); |
21 | /// assert_eq!(c.to_array(), [0, 5, 6, 3]); |
22 | /// ``` |
23 | #[inline ] |
24 | #[must_use = "method returns a new vector and does not mutate the original inputs" ] |
25 | pub fn select<U>(self, true_values: Simd<U, N>, false_values: Simd<U, N>) -> Simd<U, N> |
26 | where |
27 | U: SimdElement<Mask = T>, |
28 | { |
29 | // Safety: The mask has been cast to a vector of integers, |
30 | // and the operands to select between are vectors of the same type and length. |
31 | unsafe { core::intrinsics::simd::simd_select(self.to_int(), true_values, false_values) } |
32 | } |
33 | |
34 | /// Choose elements from two masks. |
35 | /// |
36 | /// For each element in the mask, choose the corresponding element from `true_values` if |
37 | /// that element mask is true, and `false_values` if that element mask is false. |
38 | /// |
39 | /// # Examples |
40 | /// ``` |
41 | /// # #![feature (portable_simd)] |
42 | /// # use core::simd::Mask; |
43 | /// let a = Mask::<i32, 4>::from_array([true, true, false, false]); |
44 | /// let b = Mask::<i32, 4>::from_array([false, false, true, true]); |
45 | /// let mask = Mask::<i32, 4>::from_array([true, false, false, true]); |
46 | /// let c = mask.select_mask(a, b); |
47 | /// assert_eq!(c.to_array(), [true, false, true, false]); |
48 | /// ``` |
49 | #[inline ] |
50 | #[must_use = "method returns a new mask and does not mutate the original inputs" ] |
51 | pub fn select_mask(self, true_values: Self, false_values: Self) -> Self { |
52 | self & true_values | !self & false_values |
53 | } |
54 | } |
55 | |