witx_codegen/cpp/
tuple.rs1use 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}