Skip to content

Commit d7a525f

Browse files
Merge pull request #529 from jhpratt/master
Use `impl` restrictions over hand-sealed traits
2 parents 8e3bfb0 + 61ae55e commit d7a525f

13 files changed

Lines changed: 38 additions & 131 deletions

File tree

crates/core_simd/src/cast.rs

Lines changed: 18 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,35 @@
11
use crate::simd::SimdElement;
22

3-
mod sealed {
4-
/// Cast vector elements to other types.
5-
///
6-
/// # Safety
7-
/// Implementing this trait asserts that the type is a valid vector element for the `simd_cast`
8-
/// or `simd_as` intrinsics.
9-
pub unsafe trait Sealed {}
10-
}
11-
use sealed::Sealed;
12-
133
/// Supporting trait for `Simd::cast`. Typically doesn't need to be used directly.
14-
pub trait SimdCast: Sealed + SimdElement {}
4+
///
5+
/// # Safety
6+
/// Implementing this trait asserts that the type is a valid vector element for the `simd_cast` or
7+
/// `simd_as` intrinsics.
8+
pub impl(self) unsafe trait SimdCast: SimdElement {}
159

1610
// Safety: primitive number types can be cast to other primitive number types
17-
unsafe impl Sealed for i8 {}
18-
impl SimdCast for i8 {}
11+
unsafe impl SimdCast for i8 {}
1912
// Safety: primitive number types can be cast to other primitive number types
20-
unsafe impl Sealed for i16 {}
21-
impl SimdCast for i16 {}
13+
unsafe impl SimdCast for i16 {}
2214
// Safety: primitive number types can be cast to other primitive number types
23-
unsafe impl Sealed for i32 {}
24-
impl SimdCast for i32 {}
15+
unsafe impl SimdCast for i32 {}
2516
// Safety: primitive number types can be cast to other primitive number types
26-
unsafe impl Sealed for i64 {}
27-
impl SimdCast for i64 {}
17+
unsafe impl SimdCast for i64 {}
2818
// Safety: primitive number types can be cast to other primitive number types
29-
unsafe impl Sealed for isize {}
30-
impl SimdCast for isize {}
19+
unsafe impl SimdCast for isize {}
3120
// Safety: primitive number types can be cast to other primitive number types
32-
unsafe impl Sealed for u8 {}
33-
impl SimdCast for u8 {}
21+
unsafe impl SimdCast for u8 {}
3422
// Safety: primitive number types can be cast to other primitive number types
35-
unsafe impl Sealed for u16 {}
36-
impl SimdCast for u16 {}
23+
unsafe impl SimdCast for u16 {}
3724
// Safety: primitive number types can be cast to other primitive number types
38-
unsafe impl Sealed for u32 {}
39-
impl SimdCast for u32 {}
25+
unsafe impl SimdCast for u32 {}
4026
// Safety: primitive number types can be cast to other primitive number types
41-
unsafe impl Sealed for u64 {}
42-
impl SimdCast for u64 {}
27+
unsafe impl SimdCast for u64 {}
4328
// Safety: primitive number types can be cast to other primitive number types
44-
unsafe impl Sealed for usize {}
45-
impl SimdCast for usize {}
29+
unsafe impl SimdCast for usize {}
4630
// Safety: primitive number types can be cast to other primitive number types
47-
unsafe impl Sealed for f16 {}
48-
impl SimdCast for f16 {}
31+
unsafe impl SimdCast for f16 {}
4932
// Safety: primitive number types can be cast to other primitive number types
50-
unsafe impl Sealed for f32 {}
51-
impl SimdCast for f32 {}
33+
unsafe impl SimdCast for f32 {}
5234
// Safety: primitive number types can be cast to other primitive number types
53-
unsafe impl Sealed for f64 {}
54-
impl SimdCast for f64 {}
35+
unsafe impl SimdCast for f64 {}

crates/core_simd/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
f16,
55
core_intrinsics,
66
decl_macro,
7+
impl_restriction,
78
repr_simd,
89
staged_api,
910
prelude_import,

crates/core_simd/src/masks.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ macro_rules! impl_fix_endianness {
2929

3030
impl_fix_endianness! { u8, u16, u32, u64 }
3131

32-
mod sealed {
32+
mod private_methods {
3333
use super::*;
3434

3535
/// Not only does this seal the `MaskElement` trait, but these functions prevent other traits
@@ -38,7 +38,7 @@ mod sealed {
3838
/// For example, `eq` could be provided by requiring `MaskElement: PartialEq`, but that would
3939
/// prevent us from ever removing that bound, or from implementing `MaskElement` on
4040
/// non-`PartialEq` types in the future.
41-
pub trait Sealed {
41+
pub impl(super) trait PrivateMethods {
4242
fn valid<const N: usize>(values: Simd<Self, N>) -> bool
4343
where
4444
Self: SimdElement;
@@ -55,17 +55,20 @@ mod sealed {
5555
const FALSE: Self;
5656
}
5757
}
58-
use sealed::Sealed;
58+
use private_methods::PrivateMethods;
5959

6060
/// Marker trait for types that may be used as SIMD mask elements.
6161
///
6262
/// # Safety
6363
/// Type must be a signed integer.
64-
pub unsafe trait MaskElement: SimdElement<Mask = Self> + SimdCast + Sealed {}
64+
pub impl(self) unsafe trait MaskElement:
65+
SimdElement<Mask = Self> + SimdCast + PrivateMethods
66+
{
67+
}
6568

6669
macro_rules! impl_element {
6770
{ $ty:ty, $unsigned:ty } => {
68-
impl Sealed for $ty {
71+
impl PrivateMethods for $ty {
6972
#[inline]
7073
fn valid<const N: usize>(value: Simd<Self, N>) -> bool
7174
{
@@ -196,7 +199,7 @@ where
196199
pub unsafe fn from_simd_unchecked(value: Simd<T, N>) -> Self {
197200
// Safety: the caller must confirm this invariant
198201
unsafe {
199-
core::intrinsics::assume(<T as Sealed>::valid(value));
202+
core::intrinsics::assume(<T as PrivateMethods>::valid(value));
200203
}
201204
Self(value)
202205
}

crates/core_simd/src/simd/num.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,6 @@ mod float;
44
mod int;
55
mod uint;
66

7-
mod sealed {
8-
pub trait Sealed {}
9-
}
10-
117
pub use float::*;
128
pub use int::*;
139
pub use uint::*;

crates/core_simd/src/simd/num/float.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
use super::sealed::Sealed;
21
use crate::simd::{
32
Mask, Select, Simd, SimdCast, SimdElement,
43
cmp::{SimdPartialEq, SimdPartialOrd},
54
};
65

76
/// Operations on SIMD vectors of floats.
8-
pub trait SimdFloat: Copy + Sealed {
7+
pub impl(self) trait SimdFloat: Copy {
98
/// Mask type used for manipulating this SIMD vector type.
109
type Mask;
1110

@@ -240,8 +239,6 @@ pub trait SimdFloat: Copy + Sealed {
240239
macro_rules! impl_trait {
241240
{ $($ty:ty { bits: $bits_ty:ty, mask: $mask_ty:ty }),* } => {
242241
$(
243-
impl<const N: usize> Sealed for Simd<$ty, N> {}
244-
245242
impl<const N: usize> SimdFloat for Simd<$ty, N>
246243
{
247244
type Mask = Mask<<$mask_ty as SimdElement>::Mask, N>;

crates/core_simd/src/simd/num/int.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
use super::sealed::Sealed;
21
use crate::simd::{
32
Mask, Select, Simd, SimdCast, SimdElement, cmp::SimdOrd, cmp::SimdPartialOrd, num::SimdUint,
43
};
54

65
/// Operations on SIMD vectors of signed integers.
7-
pub trait SimdInt: Copy + Sealed {
6+
pub impl(self) trait SimdInt: Copy {
87
/// Mask type used for manipulating this SIMD vector type.
98
type Mask;
109

@@ -241,8 +240,6 @@ pub trait SimdInt: Copy + Sealed {
241240
macro_rules! impl_trait {
242241
{ $($ty:ident ($unsigned:ident)),* } => {
243242
$(
244-
impl<const N: usize> Sealed for Simd<$ty, N> {}
245-
246243
impl<const N: usize> SimdInt for Simd<$ty, N> {
247244
type Mask = Mask<<$ty as SimdElement>::Mask, N>;
248245
type Scalar = $ty;

crates/core_simd/src/simd/num/uint.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
use super::sealed::Sealed;
21
use crate::simd::{Simd, SimdCast, SimdElement, cmp::SimdOrd};
32

43
/// Operations on SIMD vectors of unsigned integers.
5-
pub trait SimdUint: Copy + Sealed {
4+
pub impl(self) trait SimdUint: Copy {
65
/// Scalar type contained by this SIMD vector type.
76
type Scalar;
87

@@ -124,8 +123,6 @@ pub trait SimdUint: Copy + Sealed {
124123
macro_rules! impl_trait {
125124
{ $($ty:ident ($signed:ident)),* } => {
126125
$(
127-
impl<const N: usize> Sealed for Simd<$ty, N> {}
128-
129126
impl<const N: usize> SimdUint for Simd<$ty, N>
130127
{
131128
type Scalar = $ty;

crates/core_simd/src/simd/ptr.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,6 @@
33
mod const_ptr;
44
mod mut_ptr;
55

6-
mod sealed {
7-
pub trait Sealed {}
8-
}
9-
106
pub use const_ptr::*;
117
pub use mut_ptr::*;
128

crates/core_simd/src/simd/ptr/const_ptr.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
use super::sealed::Sealed;
21
use crate::simd::{Mask, Simd, cmp::SimdPartialEq, num::SimdUint};
32

43
/// Operations on SIMD vectors of constant pointers.
5-
pub trait SimdConstPtr: Copy + Sealed {
4+
pub impl(self) trait SimdConstPtr: Copy {
65
/// Vector of `usize` with the same number of elements.
76
type Usize;
87

@@ -65,8 +64,6 @@ pub trait SimdConstPtr: Copy + Sealed {
6564
fn wrapping_sub(self, count: Self::Usize) -> Self;
6665
}
6766

68-
impl<T, const N: usize> Sealed for Simd<*const T, N> {}
69-
7067
impl<T, const N: usize> SimdConstPtr for Simd<*const T, N> {
7168
type Usize = Simd<usize, N>;
7269
type Isize = Simd<isize, N>;

crates/core_simd/src/simd/ptr/mut_ptr.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
use super::sealed::Sealed;
21
use crate::simd::{Mask, Simd, cmp::SimdPartialEq, num::SimdUint};
32

43
/// Operations on SIMD vectors of mutable pointers.
5-
pub trait SimdMutPtr: Copy + Sealed {
4+
pub impl(self) trait SimdMutPtr: Copy {
65
/// Vector of `usize` with the same number of elements.
76
type Usize;
87

@@ -65,8 +64,6 @@ pub trait SimdMutPtr: Copy + Sealed {
6564
fn wrapping_sub(self, count: Self::Usize) -> Self;
6665
}
6766

68-
impl<T, const N: usize> Sealed for Simd<*mut T, N> {}
69-
7067
impl<T, const N: usize> SimdMutPtr for Simd<*mut T, N> {
7168
type Usize = Simd<usize, N>;
7269
type Isize = Simd<isize, N>;

0 commit comments

Comments
 (0)