mod test;
use crate::io::{DEFAULT_BUF_SIZE, Read, Result, Write};
#[cfg_attr(not(feature = "std"), doc = "[`std::io::copy`]: <https://doc.rust-lang.org/nightly/std/io/fn.copy.html>")]
pub fn copy<R: ?Sized + Read, W: ?Sized + Write>(r: &mut R, w: &mut W) -> Result<u64> {
let mut tmp = [0; DEFAULT_BUF_SIZE];
let mut total_count = 0;
'main_loop: loop {
match r.read(&mut tmp) {
Ok(0) => {
break Ok(total_count);
}
Ok(count) => {
let tmp = &tmp[..count];
loop {
match w.write(tmp) {
Ok(0) => {
break 'main_loop Ok(total_count);
}
Ok(count) => {
total_count += count as u64;
}
Err(ref e) if e.is_interrupted() => {}
Err(e) => {
break 'main_loop Err(e);
}
}
}
}
Err(ref e) if e.is_interrupted() => {}
Err(e) => {
break Err(e);
}
}
}
}