Skip to content

Commit ded3006

Browse files
embedivermkj
authored andcommitted
Move vectored copy methods to util mod
Signed-off-by: Marvin Gudel <[email protected]>
1 parent bc2d912 commit ded3006

File tree

2 files changed

+95
-95
lines changed

2 files changed

+95
-95
lines changed

mctp-estack/src/fragment.rs

Lines changed: 1 addition & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ impl Fragmenter {
179179
let remaining_payload_len = total_payload_len - self.payload_used;
180180
let l = remaining_payload_len.min(rest.len());
181181
let (d, rest) = rest.split_at_mut(l);
182-
copy_vectored(payload, self.payload_used, d);
182+
crate::util::copy_vectored(payload, self.payload_used, d);
183183
self.payload_used += l;
184184

185185
// Add the header
@@ -197,62 +197,6 @@ impl Fragmenter {
197197
}
198198
}
199199

200-
/// Copy data from a vectored src to dest
201-
///
202-
/// Copies `dest.len()` bytes from payload to dest,
203-
/// starting after `offset` bytes.
204-
///
205-
/// ## Panics
206-
///
207-
/// This function will panic when not enough bytes are available to fill dest.
208-
/// Total size of `payload` has to be `atleast dest.len()` + `offset`.
209-
fn copy_vectored(src: &[&[u8]], offset: usize, dest: &mut [u8]) {
210-
let mut i = 0;
211-
212-
while i < dest.len() {
213-
let payload_index = i + offset;
214-
let next = get_sub_slice(src, payload_index);
215-
let remaining = dest.len() - i;
216-
if remaining > next.len() {
217-
dest[i..(i + next.len())].copy_from_slice(next);
218-
i += next.len();
219-
} else {
220-
dest[i..].copy_from_slice(&next[..remaining]);
221-
return;
222-
}
223-
}
224-
}
225-
226-
/// Get a slice of `vector` indexed by `offset`
227-
///
228-
/// The `offset` is the absolute byte index.
229-
/// The returned slice is the remaining sub slice starting at `offset`.
230-
///
231-
/// ## Panics
232-
///
233-
/// Will panic when offset is larger than the size of `vector`.
234-
///
235-
/// ## Example
236-
/// ```ignore
237-
/// # use mctp_estack::fragment::get_slice;
238-
/// let vector: &[&[u8]] = &[&[1, 2, 3], &[4, 5, 6]];
239-
///
240-
/// let slice = get_slice(vector, 4);
241-
///
242-
/// assert_eq!(slice, &[5, 6]);
243-
/// ```
244-
fn get_sub_slice<'a>(vector: &'a [&[u8]], offset: usize) -> &'a [u8] {
245-
let mut i = offset;
246-
for slice in vector {
247-
if i >= slice.len() {
248-
i -= slice.len();
249-
} else {
250-
return &slice[i..];
251-
}
252-
}
253-
panic!("offset for vector out of bounds");
254-
}
255-
256200
pub enum SendOutput<'p> {
257201
Packet(&'p mut [u8]),
258202
Complete {
@@ -301,41 +245,3 @@ impl SendOutput<'_> {
301245
Self::Error { err, cookie: None }
302246
}
303247
}
304-
305-
#[cfg(test)]
306-
mod tests {
307-
#[test]
308-
fn test_get_slice() {
309-
use super::get_sub_slice;
310-
let vector: &[&[u8]] = &[&[1, 2, 3], &[4, 5, 6], &[7, 8, 9]];
311-
let slice = get_sub_slice(vector, 4);
312-
assert_eq!(slice, &[5, 6]);
313-
let slice = get_sub_slice(vector, 0);
314-
assert_eq!(slice, &[1, 2, 3]);
315-
let slice = get_sub_slice(vector, 3);
316-
assert_eq!(slice, &[4, 5, 6]);
317-
}
318-
#[test]
319-
fn test_copy_vectored() {
320-
use super::copy_vectored;
321-
let vector: &[&[u8]] = &[&[1, 2, 3], &[4, 5], &[6, 7, 8, 9]];
322-
323-
let mut dest = [0; 6];
324-
copy_vectored(vector, 1, &mut dest);
325-
assert_eq!(&dest, &[2, 3, 4, 5, 6, 7]);
326-
327-
let mut dest = [0; 5];
328-
copy_vectored(vector, 4, &mut dest);
329-
assert_eq!(&dest, &[5, 6, 7, 8, 9]);
330-
331-
let mut dest = [0; 9];
332-
copy_vectored(vector, 0, &mut dest);
333-
assert_eq!(&dest, &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
334-
335-
let vector: &[&[u8]] = &[&[1, 2, 3]];
336-
337-
let mut dest = [0; 1];
338-
copy_vectored(vector, 2, &mut dest);
339-
assert_eq!(&dest, &[3]);
340-
}
341-
}

mctp-estack/src/util.rs

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,97 @@ macro_rules! get_build_var {
1818
}
1919
}};
2020
}
21+
22+
/// Copy data from a vectored src to dest
23+
///
24+
/// Copies `dest.len()` bytes from payload to dest,
25+
/// starting after `offset` bytes.
26+
///
27+
/// ## Panics
28+
///
29+
/// This function will panic when not enough bytes are available to fill dest.
30+
/// Total size of `payload` has to be `atleast dest.len()` + `offset`.
31+
pub fn copy_vectored(src: &[&[u8]], offset: usize, dest: &mut [u8]) {
32+
let mut i = 0;
33+
34+
while i < dest.len() {
35+
let payload_index = i + offset;
36+
let next = get_sub_slice(src, payload_index);
37+
let remaining = dest.len() - i;
38+
if remaining > next.len() {
39+
dest[i..(i + next.len())].copy_from_slice(next);
40+
i += next.len();
41+
} else {
42+
dest[i..].copy_from_slice(&next[..remaining]);
43+
return;
44+
}
45+
}
46+
}
47+
48+
/// Get a slice of `vector` indexed by `offset`
49+
///
50+
/// The `offset` is the absolute byte index.
51+
/// The returned slice is the remaining sub slice starting at `offset`.
52+
///
53+
/// ## Panics
54+
///
55+
/// Will panic when offset is larger than the size of `vector`.
56+
///
57+
/// ## Example
58+
/// ```ignore
59+
/// # use mctp_estack::fragment::get_slice;
60+
/// let vector: &[&[u8]] = &[&[1, 2, 3], &[4, 5, 6]];
61+
///
62+
/// let slice = get_slice(vector, 4);
63+
///
64+
/// assert_eq!(slice, &[5, 6]);
65+
/// ```
66+
pub fn get_sub_slice<'a>(vector: &'a [&[u8]], offset: usize) -> &'a [u8] {
67+
let mut i = offset;
68+
for slice in vector {
69+
if i >= slice.len() {
70+
i -= slice.len();
71+
} else {
72+
return &slice[i..];
73+
}
74+
}
75+
panic!("offset for vector out of bounds");
76+
}
77+
78+
#[cfg(test)]
79+
mod tests {
80+
#[test]
81+
fn test_get_slice() {
82+
use super::get_sub_slice;
83+
let vector: &[&[u8]] = &[&[1, 2, 3], &[4, 5, 6], &[7, 8, 9]];
84+
let slice = get_sub_slice(vector, 4);
85+
assert_eq!(slice, &[5, 6]);
86+
let slice = get_sub_slice(vector, 0);
87+
assert_eq!(slice, &[1, 2, 3]);
88+
let slice = get_sub_slice(vector, 3);
89+
assert_eq!(slice, &[4, 5, 6]);
90+
}
91+
#[test]
92+
fn test_copy_vectored() {
93+
use super::copy_vectored;
94+
let vector: &[&[u8]] = &[&[1, 2, 3], &[4, 5], &[6, 7, 8, 9]];
95+
96+
let mut dest = [0; 6];
97+
copy_vectored(vector, 1, &mut dest);
98+
assert_eq!(&dest, &[2, 3, 4, 5, 6, 7]);
99+
100+
let mut dest = [0; 5];
101+
copy_vectored(vector, 4, &mut dest);
102+
assert_eq!(&dest, &[5, 6, 7, 8, 9]);
103+
104+
let mut dest = [0; 9];
105+
copy_vectored(vector, 0, &mut dest);
106+
assert_eq!(&dest, &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
107+
108+
let vector: &[&[u8]] = &[&[1, 2, 3]];
109+
110+
let mut dest = [0; 1];
111+
copy_vectored(vector, 2, &mut dest);
112+
assert_eq!(&dest, &[3]);
113+
}
114+
}

0 commit comments

Comments
 (0)