vitaminc_protected/
zeroed.rs

1use std::marker::PhantomData;
2
3use crate::{Equatable, Exportable, Protected, Usage};
4
5/// Similar to `Default`, but doesn't rely on the standard library,
6/// is only implemented for Paranoid types, and covers array sizes up to 1024.
7pub 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);