witx_codegen/cpp/
struct.rs

1use 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("#[repr(C, packed)]")?
12            .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}