sophon_wasm/elements/
segment.rs1use std::io;
2use super::{Deserialize, Serialize, Error, VarUint32, CountedList, InitExpr, CountedListWriter};
3
4#[derive(Debug, Clone)]
6pub struct ElementSegment {
7 index: u32,
8 offset: InitExpr,
9 members: Vec<u32>,
10}
11
12impl ElementSegment {
13 pub fn new(index: u32, offset: InitExpr, members: Vec<u32>) -> Self {
15 ElementSegment { index: index, offset: offset, members: members }
16 }
17
18 pub fn members(&self) -> &[u32] { &self.members }
20
21 pub fn members_mut(&mut self) -> &mut Vec<u32> { &mut self.members }
23
24 pub fn index(&self) -> u32 { self.index }
26
27 pub fn offset(&self) -> &InitExpr { &self.offset }
29
30 pub fn offset_mut(&mut self) -> &mut InitExpr { &mut self.offset }
32}
33
34impl Deserialize for ElementSegment {
35 type Error = Error;
36
37 fn deserialize<R: io::Read>(reader: &mut R) -> Result<Self, Self::Error> {
38 let index = VarUint32::deserialize(reader)?;
39 let offset = InitExpr::deserialize(reader)?;
40 let funcs: Vec<u32> = CountedList::<VarUint32>::deserialize(reader)?
41 .into_inner()
42 .into_iter()
43 .map(Into::into)
44 .collect();
45
46 Ok(ElementSegment {
47 index: index.into(),
48 offset: offset,
49 members: funcs,
50 })
51 }
52}
53
54impl Serialize for ElementSegment {
55 type Error = Error;
56
57 fn serialize<W: io::Write>(self, writer: &mut W) -> Result<(), Self::Error> {
58 VarUint32::from(self.index).serialize(writer)?;
59 self.offset.serialize(writer)?;
60 let data = self.members;
61 let counted_list = CountedListWriter::<VarUint32, _>(
62 data.len(),
63 data.into_iter().map(Into::into),
64 );
65 counted_list.serialize(writer)?;
66 Ok(())
67 }
68}
69
70#[derive(Clone)]
72pub struct DataSegment {
73 index: u32,
74 offset: InitExpr,
75 value: Vec<u8>,
76}
77
78impl DataSegment {
79 pub fn new(index: u32, offset: InitExpr, value: Vec<u8>) -> Self {
81 DataSegment {
82 index: index,
83 offset: offset,
84 value: value,
85 }
86 }
87
88 pub fn index(&self) -> u32 { self.index }
90
91 pub fn offset(&self) -> &InitExpr { &self.offset }
93
94 pub fn offset_mut(&mut self) -> &mut InitExpr { &mut self.offset }
96
97 pub fn value(&self) -> &[u8] { &self.value }
99
100 pub fn value_mut(&mut self) -> &mut Vec<u8> { &mut self.value }
102}
103
104impl Deserialize for DataSegment {
105 type Error = Error;
106
107 fn deserialize<R: io::Read>(reader: &mut R) -> Result<Self, Self::Error> {
108 let index = VarUint32::deserialize(reader)?;
109 let offset = InitExpr::deserialize(reader)?;
110 let value_len = VarUint32::deserialize(reader)?;
111
112 let mut value_buf = vec![0u8; value_len.into()];
113 reader.read_exact(&mut value_buf[..])?;
114
115 Ok(DataSegment {
116 index: index.into(),
117 offset: offset,
118 value: value_buf,
119 })
120 }
121}
122
123impl Serialize for DataSegment {
124 type Error = Error;
125
126 fn serialize<W: io::Write>(self, writer: &mut W) -> Result<(), Self::Error> {
127 VarUint32::from(self.index).serialize(writer)?;
128 self.offset.serialize(writer)?;
129
130 let value = self.value;
131 VarUint32::from(value.len()).serialize(writer)?;
132 writer.write_all(&value[..])?;
133 Ok(())
134 }
135}