1
1
mod sealed {
2
- pub trait Sealed { }
2
+ pub trait Sealed { }
3
3
}
4
4
use sealed:: Sealed ;
5
5
6
6
/// Supporting trait for vector `select` function
7
- pub trait Select < Mask > : Sealed { }
7
+ pub trait Select < Mask > : Sealed {
8
+ #[ doc( hidden) ]
9
+ fn select ( mask : Mask , true_values : Self , false_values : Self ) -> Self ;
10
+ }
8
11
9
12
macro_rules! impl_select {
10
13
{
@@ -17,9 +20,32 @@ macro_rules! impl_select {
17
20
crate :: $mask<LANES >: crate :: Mask ,
18
21
crate :: $bits_ty<LANES >: crate :: LanesAtMost32 ,
19
22
Self : crate :: LanesAtMost32 ,
20
- { }
23
+ {
24
+ #[ doc( hidden) ]
25
+ #[ inline]
26
+ fn select( mask: crate :: $mask<LANES >, true_values: Self , false_values: Self ) -> Self {
27
+ unsafe { crate :: intrinsics:: simd_select( mask. to_int( ) , true_values, false_values) }
28
+ }
29
+ }
21
30
) *
22
31
32
+ impl <const LANES : usize > Sealed for crate :: $mask<LANES >
33
+ where
34
+ Self : crate :: Mask ,
35
+ crate :: $bits_ty<LANES >: crate :: LanesAtMost32 ,
36
+ { }
37
+ impl <const LANES : usize > Select <Self > for crate :: $mask<LANES >
38
+ where
39
+ Self : crate :: Mask ,
40
+ crate :: $bits_ty<LANES >: crate :: LanesAtMost32 ,
41
+ {
42
+ #[ doc( hidden) ]
43
+ #[ inline]
44
+ fn select( mask: Self , true_values: Self , false_values: Self ) -> Self {
45
+ mask & true_values | !mask & false_values
46
+ }
47
+ }
48
+
23
49
impl <const LANES : usize > crate :: $mask<LANES >
24
50
where
25
51
Self : crate :: Mask ,
@@ -38,8 +64,19 @@ macro_rules! impl_select {
38
64
/// let c = mask.select(a, b);
39
65
/// assert_eq!(c.to_array(), [0, 5, 6, 3]);
40
66
/// ```
67
+ ///
68
+ /// `select` can also be used on masks:
69
+ /// ```
70
+ /// # use core_simd::Mask32;
71
+ /// let a = Mask32::from_array([true, true, false, false]);
72
+ /// let b = Mask32::from_array([false, false, true, true]);
73
+ /// let mask = Mask32::from_array([true, false, false, true]);
74
+ /// let c = mask.select(a, b);
75
+ /// assert_eq!(c.to_array(), [true, false, true, false]);
76
+ /// ```
77
+ #[ inline]
41
78
pub fn select<S : Select <Self >>( self , true_values: S , false_values: S ) -> S {
42
- unsafe { crate :: intrinsics :: simd_select ( self . to_int ( ) , true_values, false_values) }
79
+ S :: select ( self , true_values, false_values)
43
80
}
44
81
}
45
82
}
0 commit comments