Skip to content

Commit e22fac7

Browse files
committed
Refactor serializing to use chunks_exact_mut
This replaces the old offset handling and for loops with iterators operating on a chunked view of the data.
1 parent c658ace commit e22fac7

File tree

5 files changed

+25
-24
lines changed

5 files changed

+25
-24
lines changed

src/packet/forward_tsn_chunk.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,16 +81,15 @@ impl SerializableTlv for ForwardTsnChunk {
8181
let value = write_chunk_header(CHUNK_TYPE, 0, self.value_size(), output);
8282
write_u32_be!(&mut value[0..4], self.new_cumulative_tsn.0);
8383

84-
let mut offset = 4;
85-
for skipped in &self.skipped_streams {
84+
let mut chunks = value[4..].chunks_exact_mut(4);
85+
for (skipped, chunk) in self.skipped_streams.iter().zip(&mut chunks) {
8686
match skipped {
8787
SkippedStream::ForwardTsn(stream_id, ssn) => {
88-
write_u16_be!(&mut value[offset..offset + 2], stream_id.0);
89-
write_u16_be!(&mut value[offset + 2..offset + 4], ssn.0);
88+
write_u16_be!(&mut chunk[0..2], stream_id.0);
89+
write_u16_be!(&mut chunk[2..4], ssn.0);
9090
}
9191
_ => panic!("Unsupported skipped stream"),
9292
}
93-
offset += 4;
9493
}
9594
}
9695

src/packet/iforward_tsn_chunk.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,18 +90,17 @@ impl SerializableTlv for IForwardTsnChunk {
9090
let value = write_chunk_header(CHUNK_TYPE, 0, self.value_size(), output);
9191
write_u32_be!(&mut value[0..4], self.new_cumulative_tsn.0);
9292

93-
let mut offset = 4;
94-
for skipped in &self.skipped_streams {
93+
let mut chunks = value[4..].chunks_exact_mut(8);
94+
for (skipped, chunk) in self.skipped_streams.iter().zip(&mut chunks) {
9595
match skipped {
9696
SkippedStream::IForwardTsn(stream_key, mid) => {
97-
write_u16_be!(&mut value[offset..offset + 2], stream_key.id().0);
98-
value[offset + 2] = 0;
99-
value[offset + 3] = if stream_key.is_unordered() { 1 } else { 0 };
100-
write_u32_be!(&mut value[offset + 4..offset + 8], mid.0);
97+
write_u16_be!(&mut chunk[0..2], stream_key.id().0);
98+
chunk[2] = 0;
99+
chunk[3] = if stream_key.is_unordered() { 1 } else { 0 };
100+
write_u32_be!(&mut chunk[4..8], mid.0);
101101
}
102102
_ => panic!("Unsupported skipped stream"),
103103
}
104-
offset += 8;
105104
}
106105
}
107106

src/packet/incoming_ssn_reset_request_parameter.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,9 @@ impl SerializableTlv for IncomingSsnResetRequestParameter {
6868
fn serialize_to(&self, output: &mut [u8]) {
6969
let value = write_parameter_header(PARAMETER_TYPE, self.value_size(), output);
7070
write_u32_be!(&mut value[0..4], self.request_seq_nbr);
71-
for (idx, stream_id) in self.streams.iter().enumerate() {
72-
write_u16_be!(&mut value[4 + idx * 2..4 + idx * 2 + 2], stream_id.0);
71+
let mut chunks = value[4..].chunks_exact_mut(2);
72+
for (stream_id, chunk) in self.streams.iter().zip(&mut chunks) {
73+
write_u16_be!(chunk, stream_id.0);
7374
}
7475
}
7576

src/packet/outgoing_ssn_reset_request_parameter.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,9 @@ impl SerializableTlv for OutgoingSsnResetRequestParameter {
8484
write_u32_be!(&mut value[0..4], self.request_seq_nbr);
8585
write_u32_be!(&mut value[4..8], self.response_seq_nbr);
8686
write_u32_be!(&mut value[8..12], self.sender_last_assigned_tsn.0);
87-
for (idx, stream_id) in self.streams.iter().enumerate() {
88-
write_u16_be!(&mut value[12 + idx * 2..12 + idx * 2 + 2], stream_id.0);
87+
let mut chunks = value[12..].chunks_exact_mut(2);
88+
for (stream_id, chunk) in self.streams.iter().zip(&mut chunks) {
89+
write_u16_be!(chunk, stream_id.0);
8990
}
9091
}
9192

src/packet/sack_chunk.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -123,16 +123,17 @@ impl SerializableTlv for SackChunk {
123123
write_u16_be!(&mut value[8..10], self.gap_ack_blocks.len() as u16);
124124
write_u16_be!(&mut value[10..12], self.duplicate_tsns.len() as u16);
125125

126-
let mut offset = 12;
127-
for block in &self.gap_ack_blocks {
128-
write_u16_be!(&mut value[offset..offset + 2], block.start);
129-
write_u16_be!(&mut value[offset + 2..offset + 4], block.end);
130-
offset += 4;
126+
let gap_blocks_end = 12 + self.gap_ack_blocks.len() * 4;
127+
128+
let mut chunks = value[12..gap_blocks_end].chunks_exact_mut(4);
129+
for (block, chunk) in self.gap_ack_blocks.iter().zip(&mut chunks) {
130+
write_u16_be!(&mut chunk[0..2], block.start);
131+
write_u16_be!(&mut chunk[2..4], block.end);
131132
}
132133

133-
for dup_tsn in &self.duplicate_tsns {
134-
write_u32_be!(&mut value[offset..offset + 4], dup_tsn.0);
135-
offset += 4;
134+
let mut chunks = value[gap_blocks_end..].chunks_exact_mut(4);
135+
for (dup_tsn, chunk) in self.duplicate_tsns.iter().zip(&mut chunks) {
136+
write_u32_be!(chunk, dup_tsn.0);
136137
}
137138
}
138139

0 commit comments

Comments
 (0)