1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
use crate::{
consumer::Consumer,
producer::Producer,
ring_buffer::{RbRead, RbRef, RbWrite},
};
pub fn transfer<T, Rs: RbRef, Rd: RbRef>(
src: &mut Consumer<T, Rs>,
dst: &mut Producer<T, Rd>,
count: Option<usize>,
) -> usize
where
Rs::Rb: RbRead<T>,
Rd::Rb: RbWrite<T>,
{
let (src_left, src_right) = unsafe { src.as_uninit_slices() };
let (dst_left, dst_right) = unsafe { dst.free_space_as_slices() };
let src_iter = src_left.iter().chain(src_right.iter());
let dst_iter = dst_left.iter_mut().chain(dst_right.iter_mut());
let mut actual_count = 0;
for (src_elem, dst_place) in src_iter.zip(dst_iter) {
if let Some(count) = count {
if actual_count >= count {
break;
}
}
unsafe { dst_place.write(src_elem.as_ptr().read()) };
actual_count += 1;
}
unsafe { src.advance(actual_count) };
unsafe { dst.advance(actual_count) };
actual_count
}