witx_codegen/cpp/
struct.rs1use super::*;
2use std::io::Write;
3
4impl CppGenerator {
5 pub fn define_as_struct<T: Write>(
6 w: &mut PrettyWriter<T>,
7 name: &str,
8 members: &[ASStructMember],
9 ) -> Result<(), Error> {
10 w
11 .write_line(format!(
13 "struct __attribute__((packed)) {} {{",
14 name.as_type()
15 ))?;
16 {
17 let mut w = w.new_block();
18 for member in members {
19 let member_type = member.type_.as_ref();
20 w.write_line(format!(
21 "{} {};",
22 member_type.as_lang(),
23 member.name.as_var()
24 ))?;
25
26 let pad_len = member.padding;
27 for i in 0..(pad_len & 1) {
28 w.write_line(format!("uint8_t __pad8_{};", i))?;
29 }
30 for i in 0..(pad_len & 3) / 2 {
31 w.write_line(format!("uint16_t __pad16_{};", i))?;
32 }
33 for i in 0..(pad_len & 7) / 4 {
34 w.write_line(format!("uint32_t __pad32_{};", i))?;
35 }
36 for i in 0..pad_len / 8 {
37 w.write_line(format!("uint64_t __pad64_{};", i))?;
38 }
39 }
40 }
41 w.write_line("};")?.eob()?;
42
43 for member in members {
44 w.write_line(format!(
45 "static_assert(offsetof({}, {}) == {}, \"Error layout\");",
46 name.as_type(),
47 member.name.as_var(),
48 member.offset
49 ))?;
50 }
51
52 Ok(())
53 }
54}