File: enum_to_bytes.rs

package info (click to toggle)
rust-zerocopy-derive 0.8.26-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 956 kB
  • sloc: makefile: 2
file content (133 lines) | stat: -rw-r--r-- 2,390 bytes parent folder | download | duplicates (15)
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
// Copyright 2019 The Fuchsia Authors
//
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
// This file may not be copied, modified, or distributed except according to
// those terms.

// See comment in `include.rs` for why we disable the prelude.
#![no_implicit_prelude]
#![allow(warnings)]

include!("include.rs");

// An enum is `IntoBytes` if if has a defined repr.

#[derive(imp::IntoBytes)]
#[repr(C)]
enum C {
    A,
}

util_assert_impl_all!(C: imp::IntoBytes);

#[derive(imp::IntoBytes)]
#[repr(u8)]
enum U8 {
    A,
}

util_assert_impl_all!(U8: imp::IntoBytes);

#[derive(imp::IntoBytes)]
#[repr(u16)]
enum U16 {
    A,
}

util_assert_impl_all!(U16: imp::IntoBytes);

#[derive(imp::IntoBytes)]
#[repr(u32)]
enum U32 {
    A,
}

util_assert_impl_all!(U32: imp::IntoBytes);

#[derive(imp::IntoBytes)]
#[repr(u64)]
enum U64 {
    A,
}

util_assert_impl_all!(U64: imp::IntoBytes);

#[derive(imp::IntoBytes)]
#[repr(usize)]
enum Usize {
    A,
}

util_assert_impl_all!(Usize: imp::IntoBytes);

#[derive(imp::IntoBytes)]
#[repr(i8)]
enum I8 {
    A,
}

util_assert_impl_all!(I8: imp::IntoBytes);

#[derive(imp::IntoBytes)]
#[repr(i16)]
enum I16 {
    A,
}

util_assert_impl_all!(I16: imp::IntoBytes);

#[derive(imp::IntoBytes)]
#[repr(i32)]
enum I32 {
    A,
}

util_assert_impl_all!(I32: imp::IntoBytes);

#[derive(imp::IntoBytes)]
#[repr(i64)]
enum I64 {
    A,
}

util_assert_impl_all!(I64: imp::IntoBytes);

#[derive(imp::IntoBytes)]
#[repr(isize)]
enum Isize {
    A,
}

util_assert_impl_all!(Isize: imp::IntoBytes);

#[derive(imp::IntoBytes)]
#[repr(u8)]
enum HasData {
    A(u8),
    B(i8),
}

util_assert_impl_all!(HasData: imp::IntoBytes);

#[derive(imp::IntoBytes)]
#[repr(u32)]
enum HasData32 {
    A(u32),
    B(i32),
    C([u8; 4]),
    D([u16; 2]),
}

util_assert_impl_all!(HasData: imp::IntoBytes);

// After #1752 landed but before #1758 was fixed, this failed to compile because
// the padding check treated the tag type as being `#[repr(u8, align(2))] struct
// Tag { A }`, which is two bytes long, rather than the correct `#[repr(u8)]
// struct Tag { A }`, which is one byte long.
#[derive(imp::IntoBytes)]
#[repr(u8, align(2))]
enum BadTagWouldHavePadding {
    A(u8, u16),
}