witx_codegen/cpp/
tuple.rs

1use super::*;
2use std::io::Write;
3
4pub struct Tuple;
5
6impl Tuple {
7    pub fn name_for(tuple_members: &[ASTupleMember]) -> String {
8        format!(
9            "WasiTuple{}{}",
10            tuple_members.len(),
11            tuple_members
12                .iter()
13                .map(|member| member.type_.to_string())
14                .collect::<Vec<_>>()
15                .join("_")
16        )
17    }
18}
19
20impl CppGenerator {
21    pub fn define_as_tuple<T: Write>(
22        w: &mut PrettyWriter<T>,
23        name: &str,
24        members: &[ASTupleMember],
25    ) -> Result<(), Error> {
26        w.write_line(format!("struct {} {{ // -- Tuple", name.as_type()))?;
27        {
28            let mut w = w.new_block();
29            for (i, member) in members.iter().enumerate() {
30                let member_type = member.type_.as_ref();
31                w.write_line(format!("{} v{};", member_type.as_lang(), i))?;
32
33                let pad_len = member.padding;
34                for i in 0..(pad_len & 1) {
35                    w.write_line(format!("uint8_t __pad8_{};", i))?;
36                }
37                for i in 0..(pad_len & 3) / 2 {
38                    w.write_line(format!("uint16_t __pad16_{};", i))?;
39                }
40                for i in 0..(pad_len & 7) / 4 {
41                    w.write_line(format!("uint32_t __pad32_{};", i))?;
42                }
43                for i in 0..pad_len / 8 {
44                    w.write_line(format!("uint64_t __pad64_{};", i))?;
45                }
46            }
47        }
48        w.write_line("};")?.eob()?;
49        Ok(())
50    }
51}