Coverage Report

Created: 2025-12-31 07:38

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/bytemuck-1.24.0/src/zeroable.rs
Line
Count
Source
1
use super::*;
2
3
/// Trait for types that can be safely created with
4
/// [`zeroed`](core::mem::zeroed).
5
///
6
/// An all-zeroes value may or may not be the same value as the
7
/// [Default](core::default::Default) value of the type.
8
///
9
/// ## Safety
10
///
11
/// * Your type must be inhabited (eg: no
12
///   [Infallible](core::convert::Infallible)).
13
/// * Your type must be allowed to be an "all zeroes" bit pattern (eg: no
14
///   [`NonNull<T>`](core::ptr::NonNull)).
15
///
16
/// ## Features
17
///
18
/// Some `impl`s are feature gated due to the MSRV policy:
19
///
20
/// * `MaybeUninit<T>` was not available in 1.34.0, but is available under the
21
///   `zeroable_maybe_uninit` feature flag.
22
/// * `Atomic*` types require Rust 1.60.0 or later to work on certain platforms,
23
///   but is available under the `zeroable_atomics` feature flag.
24
/// * `[T; N]` for arbitrary `N` requires the `min_const_generics` feature flag.
25
pub unsafe trait Zeroable: Sized {
26
  /// Calls [`zeroed`](core::mem::zeroed).
27
  ///
28
  /// This is a trait method so that you can write `MyType::zeroed()` in your
29
  /// code. It is a contract of this trait that if you implement it on your type
30
  /// you **must not** override this method.
31
  #[inline]
32
5.39M
  fn zeroed() -> Self {
33
5.39M
    unsafe { core::mem::zeroed() }
34
5.39M
  }
<font_types::fixed::Fixed as bytemuck::zeroable::Zeroable>::zeroed
Line
Count
Source
32
15.5k
  fn zeroed() -> Self {
33
15.5k
    unsafe { core::mem::zeroed() }
34
15.5k
  }
<font_types::fixed::F26Dot6 as bytemuck::zeroable::Zeroable>::zeroed
Line
Count
Source
32
5.37M
  fn zeroed() -> Self {
33
5.37M
    unsafe { core::mem::zeroed() }
34
5.37M
  }
Unexecuted instantiation: <f32 as bytemuck::zeroable::Zeroable>::zeroed
Unexecuted instantiation: <_ as bytemuck::zeroable::Zeroable>::zeroed
35
}
36
unsafe impl Zeroable for () {}
37
unsafe impl Zeroable for bool {}
38
unsafe impl Zeroable for char {}
39
unsafe impl Zeroable for u8 {}
40
unsafe impl Zeroable for i8 {}
41
unsafe impl Zeroable for u16 {}
42
unsafe impl Zeroable for i16 {}
43
unsafe impl Zeroable for u32 {}
44
unsafe impl Zeroable for i32 {}
45
unsafe impl Zeroable for u64 {}
46
unsafe impl Zeroable for i64 {}
47
unsafe impl Zeroable for usize {}
48
unsafe impl Zeroable for isize {}
49
unsafe impl Zeroable for u128 {}
50
unsafe impl Zeroable for i128 {}
51
#[cfg(feature = "nightly_float")]
52
unsafe impl Zeroable for f16 {}
53
unsafe impl Zeroable for f32 {}
54
unsafe impl Zeroable for f64 {}
55
#[cfg(feature = "nightly_float")]
56
unsafe impl Zeroable for f128 {}
57
unsafe impl<T: Zeroable> Zeroable for Wrapping<T> {}
58
unsafe impl<T: Zeroable> Zeroable for core::cmp::Reverse<T> {}
59
#[cfg(feature = "pod_saturating")]
60
unsafe impl<T: Zeroable> Zeroable for core::num::Saturating<T> {}
61
62
// Note: we can't implement this for all `T: ?Sized` types because it would
63
// create NULL pointers for vtables.
64
// Maybe one day this could be changed to be implemented for
65
// `T: ?Sized where <T as core::ptr::Pointee>::Metadata: Zeroable`.
66
unsafe impl<T> Zeroable for *mut T {}
67
unsafe impl<T> Zeroable for *const T {}
68
unsafe impl<T> Zeroable for *mut [T] {}
69
unsafe impl<T> Zeroable for *const [T] {}
70
unsafe impl Zeroable for *mut str {}
71
unsafe impl Zeroable for *const str {}
72
73
unsafe impl<T: ?Sized> Zeroable for PhantomData<T> {}
74
unsafe impl Zeroable for PhantomPinned {}
75
unsafe impl<T: Zeroable> Zeroable for core::mem::ManuallyDrop<T> {}
76
unsafe impl<T: Zeroable> Zeroable for core::cell::UnsafeCell<T> {}
77
unsafe impl<T: Zeroable> Zeroable for core::cell::Cell<T> {}
78
79
#[cfg(feature = "zeroable_atomics")]
80
#[cfg_attr(feature = "nightly_docs", doc(cfg(feature = "zeroable_atomics")))]
81
mod atomic_impls {
82
  use super::Zeroable;
83
84
  #[cfg(target_has_atomic = "8")]
85
  unsafe impl Zeroable for core::sync::atomic::AtomicBool {}
86
  #[cfg(target_has_atomic = "8")]
87
  unsafe impl Zeroable for core::sync::atomic::AtomicU8 {}
88
  #[cfg(target_has_atomic = "8")]
89
  unsafe impl Zeroable for core::sync::atomic::AtomicI8 {}
90
91
  #[cfg(target_has_atomic = "16")]
92
  unsafe impl Zeroable for core::sync::atomic::AtomicU16 {}
93
  #[cfg(target_has_atomic = "16")]
94
  unsafe impl Zeroable for core::sync::atomic::AtomicI16 {}
95
96
  #[cfg(target_has_atomic = "32")]
97
  unsafe impl Zeroable for core::sync::atomic::AtomicU32 {}
98
  #[cfg(target_has_atomic = "32")]
99
  unsafe impl Zeroable for core::sync::atomic::AtomicI32 {}
100
101
  #[cfg(target_has_atomic = "64")]
102
  unsafe impl Zeroable for core::sync::atomic::AtomicU64 {}
103
  #[cfg(target_has_atomic = "64")]
104
  unsafe impl Zeroable for core::sync::atomic::AtomicI64 {}
105
106
  #[cfg(target_has_atomic = "ptr")]
107
  unsafe impl Zeroable for core::sync::atomic::AtomicUsize {}
108
  #[cfg(target_has_atomic = "ptr")]
109
  unsafe impl Zeroable for core::sync::atomic::AtomicIsize {}
110
111
  #[cfg(target_has_atomic = "ptr")]
112
  unsafe impl<T> Zeroable for core::sync::atomic::AtomicPtr<T> {}
113
}
114
115
#[cfg(feature = "zeroable_maybe_uninit")]
116
#[cfg_attr(
117
  feature = "nightly_docs",
118
  doc(cfg(feature = "zeroable_maybe_uninit"))
119
)]
120
unsafe impl<T> Zeroable for core::mem::MaybeUninit<T> {}
121
122
unsafe impl<A: Zeroable> Zeroable for (A,) {}
123
unsafe impl<A: Zeroable, B: Zeroable> Zeroable for (A, B) {}
124
unsafe impl<A: Zeroable, B: Zeroable, C: Zeroable> Zeroable for (A, B, C) {}
125
unsafe impl<A: Zeroable, B: Zeroable, C: Zeroable, D: Zeroable> Zeroable
126
  for (A, B, C, D)
127
{
128
}
129
unsafe impl<A: Zeroable, B: Zeroable, C: Zeroable, D: Zeroable, E: Zeroable>
130
  Zeroable for (A, B, C, D, E)
131
{
132
}
133
unsafe impl<
134
    A: Zeroable,
135
    B: Zeroable,
136
    C: Zeroable,
137
    D: Zeroable,
138
    E: Zeroable,
139
    F: Zeroable,
140
  > Zeroable for (A, B, C, D, E, F)
141
{
142
}
143
unsafe impl<
144
    A: Zeroable,
145
    B: Zeroable,
146
    C: Zeroable,
147
    D: Zeroable,
148
    E: Zeroable,
149
    F: Zeroable,
150
    G: Zeroable,
151
  > Zeroable for (A, B, C, D, E, F, G)
152
{
153
}
154
unsafe impl<
155
    A: Zeroable,
156
    B: Zeroable,
157
    C: Zeroable,
158
    D: Zeroable,
159
    E: Zeroable,
160
    F: Zeroable,
161
    G: Zeroable,
162
    H: Zeroable,
163
  > Zeroable for (A, B, C, D, E, F, G, H)
164
{
165
}
166
167
#[cfg(feature = "min_const_generics")]
168
#[cfg_attr(feature = "nightly_docs", doc(cfg(feature = "min_const_generics")))]
169
unsafe impl<T, const N: usize> Zeroable for [T; N] where T: Zeroable {}
170
171
#[cfg(not(feature = "min_const_generics"))]
172
impl_unsafe_marker_for_array!(
173
  Zeroable, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
174
  19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 48, 64, 96, 128, 256,
175
  512, 1024, 2048, 4096
176
);
177
178
impl_unsafe_marker_for_simd!(
179
  #[cfg(all(target_arch = "wasm32", feature = "wasm_simd"))]
180
  unsafe impl Zeroable for wasm32::{v128}
181
);
182
183
impl_unsafe_marker_for_simd!(
184
  #[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
185
  unsafe impl Zeroable for aarch64::{
186
    float32x2_t, float32x2x2_t, float32x2x3_t, float32x2x4_t, float32x4_t,
187
    float32x4x2_t, float32x4x3_t, float32x4x4_t, float64x1_t, float64x1x2_t,
188
    float64x1x3_t, float64x1x4_t, float64x2_t, float64x2x2_t, float64x2x3_t,
189
    float64x2x4_t, int16x4_t, int16x4x2_t, int16x4x3_t, int16x4x4_t, int16x8_t,
190
    int16x8x2_t, int16x8x3_t, int16x8x4_t, int32x2_t, int32x2x2_t, int32x2x3_t,
191
    int32x2x4_t, int32x4_t, int32x4x2_t, int32x4x3_t, int32x4x4_t, int64x1_t,
192
    int64x1x2_t, int64x1x3_t, int64x1x4_t, int64x2_t, int64x2x2_t, int64x2x3_t,
193
    int64x2x4_t, int8x16_t, int8x16x2_t, int8x16x3_t, int8x16x4_t, int8x8_t,
194
    int8x8x2_t, int8x8x3_t, int8x8x4_t, poly16x4_t, poly16x4x2_t, poly16x4x3_t,
195
    poly16x4x4_t, poly16x8_t, poly16x8x2_t, poly16x8x3_t, poly16x8x4_t,
196
    poly64x1_t, poly64x1x2_t, poly64x1x3_t, poly64x1x4_t, poly64x2_t,
197
    poly64x2x2_t, poly64x2x3_t, poly64x2x4_t, poly8x16_t, poly8x16x2_t,
198
    poly8x16x3_t, poly8x16x4_t, poly8x8_t, poly8x8x2_t, poly8x8x3_t, poly8x8x4_t,
199
    uint16x4_t, uint16x4x2_t, uint16x4x3_t, uint16x4x4_t, uint16x8_t,
200
    uint16x8x2_t, uint16x8x3_t, uint16x8x4_t, uint32x2_t, uint32x2x2_t,
201
    uint32x2x3_t, uint32x2x4_t, uint32x4_t, uint32x4x2_t, uint32x4x3_t,
202
    uint32x4x4_t, uint64x1_t, uint64x1x2_t, uint64x1x3_t, uint64x1x4_t,
203
    uint64x2_t, uint64x2x2_t, uint64x2x3_t, uint64x2x4_t, uint8x16_t,
204
    uint8x16x2_t, uint8x16x3_t, uint8x16x4_t, uint8x8_t, uint8x8x2_t,
205
    uint8x8x3_t, uint8x8x4_t,
206
  }
207
);
208
209
impl_unsafe_marker_for_simd!(
210
  #[cfg(target_arch = "x86")]
211
  unsafe impl Zeroable for x86::{
212
    __m128i, __m128, __m128d,
213
    __m256i, __m256, __m256d,
214
  }
215
);
216
217
impl_unsafe_marker_for_simd!(
218
  #[cfg(target_arch = "x86_64")]
219
    unsafe impl Zeroable for x86_64::{
220
        __m128i, __m128, __m128d,
221
        __m256i, __m256, __m256d,
222
    }
223
);
224
225
#[cfg(feature = "nightly_portable_simd")]
226
#[cfg_attr(
227
  feature = "nightly_docs",
228
  doc(cfg(feature = "nightly_portable_simd"))
229
)]
230
unsafe impl<T, const N: usize> Zeroable for core::simd::Simd<T, N>
231
where
232
  T: core::simd::SimdElement + Zeroable,
233
  core::simd::LaneCount<N>: core::simd::SupportedLaneCount,
234
{
235
}
236
237
impl_unsafe_marker_for_simd!(
238
  #[cfg(all(target_arch = "x86", feature = "avx512_simd"))]
239
  unsafe impl Zeroable for x86::{
240
    __m512, __m512d, __m512i
241
  }
242
);
243
244
impl_unsafe_marker_for_simd!(
245
  #[cfg(all(target_arch = "x86_64", feature = "avx512_simd"))]
246
  unsafe impl Zeroable for x86_64::{
247
    __m512, __m512d, __m512i
248
  }
249
);
250
251
impl_unsafe_marker_for_simd!(
252
  #[cfg(all(target_arch = "x86",  feature = "avx512_simd"))]
253
  unsafe impl Zeroable for x86::{
254
    __m128bh, __m256bh, __m512bh
255
  }
256
);
257
258
impl_unsafe_marker_for_simd!(
259
  #[cfg(all(target_arch = "x86_64", feature = "avx512_simd"))]
260
  unsafe impl Zeroable for x86_64::{
261
    __m128bh, __m256bh, __m512bh
262
  }
263
);