1use std::marker::PhantomData;
2
3use crate::{Equatable, Exportable, Protected, Usage};
4
5pub trait Zeroed {
8 fn zeroed() -> Self;
9}
10
11macro_rules! impl_zeroed_for_array {
12 ($t:ty, $($N:expr),+) => {
13 $(
14 impl Zeroed for [$t; $N] {
15 fn zeroed() -> Self {
16 [0; $N]
17 }
18 }
19 )+
20 };
21}
22
23macro_rules! impl_zeroed_for_literal {
24 ($($t:ty),+) => {
25 $(
26 impl Zeroed for $t {
27 fn zeroed() -> Self {
28 0
29 }
30 }
31 )+
32 };
33}
34
35impl<T> Zeroed for Protected<T>
36where
37 T: Zeroed,
38{
39 fn zeroed() -> Self {
40 Protected(T::zeroed())
41 }
42}
43
44impl<T> Zeroed for Equatable<T>
45where
46 T: Zeroed,
47{
48 fn zeroed() -> Self {
49 Equatable(T::zeroed())
50 }
51}
52
53impl<T> Zeroed for Exportable<T>
54where
55 T: Zeroed,
56{
57 fn zeroed() -> Self {
58 Exportable(T::zeroed())
59 }
60}
61
62impl<T, S> Zeroed for Usage<T, S>
63where
64 T: Zeroed,
65{
66 fn zeroed() -> Self {
67 Usage(T::zeroed(), PhantomData)
68 }
69}
70
71impl_zeroed_for_array!(
72 u8, 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,
73 26, 27, 28, 29, 30, 31, 32, 48, 64, 128, 256, 512, 1024
74);
75impl_zeroed_for_array!(
76 u16, 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,
77 26, 27, 28, 29, 30, 31, 32, 48, 64, 128, 256, 512
78);
79impl_zeroed_for_array!(
80 u32, 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,
81 26, 27, 28, 29, 30, 31, 32, 48, 64, 128, 256
82);
83impl_zeroed_for_literal!(u8, u16, u32, u64, u128);