1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
use crate::simd::SimdElement;

/// 支持 `Simd::cast` 的 trait。通常不需要直接使用。
///
/// # Safety
/// 实现此 trait 断言该类型是 `simd_cast` 或 `simd_as` 内部函数的有效 vector 元素。
///
pub unsafe trait SimdCast: SimdElement {}

// 安全: 原始数字类型可以转换为其他原始数字类型
unsafe impl SimdCast for i8 {}
// 安全: 原始数字类型可以转换为其他原始数字类型
unsafe impl SimdCast for i16 {}
// 安全: 原始数字类型可以转换为其他原始数字类型
unsafe impl SimdCast for i32 {}
// 安全: 原始数字类型可以转换为其他原始数字类型
unsafe impl SimdCast for i64 {}
// 安全: 原始数字类型可以转换为其他原始数字类型
unsafe impl SimdCast for isize {}
// 安全: 原始数字类型可以转换为其他原始数字类型
unsafe impl SimdCast for u8 {}
// 安全: 原始数字类型可以转换为其他原始数字类型
unsafe impl SimdCast for u16 {}
// 安全: 原始数字类型可以转换为其他原始数字类型
unsafe impl SimdCast for u32 {}
// 安全: 原始数字类型可以转换为其他原始数字类型
unsafe impl SimdCast for u64 {}
// 安全: 原始数字类型可以转换为其他原始数字类型
unsafe impl SimdCast for usize {}
// 安全: 原始数字类型可以转换为其他原始数字类型
unsafe impl SimdCast for f32 {}
// 安全: 原始数字类型可以转换为其他原始数字类型
unsafe impl SimdCast for f64 {}

/// 支持 `Simd::cast_ptr` 的 trait。通常不需要直接使用。
///
/// # Safety
/// 实现此 trait 断言该类型是 `simd_cast_ptr` 内部函数的有效 vector 元素。
///
pub unsafe trait SimdCastPtr<T> {}

// 安全性: 指针可以转换为其他指针类型
unsafe impl<T, U> SimdCastPtr<T> for *const U
where
    U: core::ptr::Pointee,
    T: core::ptr::Pointee<Metadata = U::Metadata>,
{
}
// 安全性: 指针可以转换为其他指针类型
unsafe impl<T, U> SimdCastPtr<T> for *mut U
where
    U: core::ptr::Pointee,
    T: core::ptr::Pointee<Metadata = U::Metadata>,
{
}