1 use crate::cmp
::{max, min}
;
2 use crate::collections
::VecDeque
;
8 let mut r
= repeat(0).take(4);
10 assert_eq
!(copy(&mut r
, &mut w
).unwrap(), 4);
12 let mut r
= repeat(0).take(1 << 17);
13 assert_eq
!(copy(&mut r
as &mut dyn Read
, &mut w
as &mut dyn Write
).unwrap(), 1 << 17);
19 observed_buffer
: usize,
22 impl Read
for ShortReader
{
23 fn read(&mut self, buf
: &mut [u8]) -> Result
<usize> {
24 let bytes
= min(self.cap
, self.read_size
).min(buf
.len());
26 self.observed_buffer
= max(self.observed_buffer
, buf
.len());
31 struct WriteObserver
{
32 observed_buffer
: usize,
35 impl Write
for WriteObserver
{
36 fn write(&mut self, buf
: &[u8]) -> Result
<usize> {
37 self.observed_buffer
= max(self.observed_buffer
, buf
.len());
41 fn flush(&mut self) -> Result
<()> {
47 fn copy_specializes_bufwriter() {
49 let buf_sz
= 16 * 1024;
50 let mut r
= ShortReader { cap, observed_buffer: 0, read_size: 1337 }
;
51 let mut w
= BufWriter
::with_capacity(buf_sz
, WriteObserver { observed_buffer: 0 }
);
53 copy(&mut r
, &mut w
).unwrap(),
55 "expected the whole capacity to be copied"
57 assert_eq
!(r
.observed_buffer
, buf_sz
, "expected a large buffer to be provided to the reader");
58 assert
!(w
.get_mut().observed_buffer
> DEFAULT_BUF_SIZE
, "expected coalesced writes");
62 fn copy_specializes_bufreader() {
63 let mut source
= vec
![0; 768 * 1024];
65 let mut buffered
= BufReader
::with_capacity(256 * 1024, Cursor
::new(&mut source
));
67 let mut sink
= Vec
::new();
68 assert_eq
!(crate::io
::copy(&mut buffered
, &mut sink
).unwrap(), source
.len() as u64);
69 assert_eq
!(source
.as_slice(), sink
.as_slice());
71 let buf_sz
= 71 * 1024;
72 assert
!(buf_sz
> DEFAULT_BUF_SIZE
, "test precondition");
74 let mut buffered
= BufReader
::with_capacity(buf_sz
, Cursor
::new(&mut source
));
75 let mut sink
= WriteObserver { observed_buffer: 0 }
;
76 assert_eq
!(crate::io
::copy(&mut buffered
, &mut sink
).unwrap(), source
.len() as u64);
78 sink
.observed_buffer
, buf_sz
,
79 "expected a large buffer to be provided to the writer"
84 fn copy_specializes_to_vec() {
85 let cap
= DEFAULT_BUF_SIZE
* 10;
86 let mut source
= ShortReader { cap, observed_buffer: 0, read_size: DEFAULT_BUF_SIZE }
;
87 let mut sink
= Vec
::new();
88 let copied
= io
::copy(&mut source
, &mut sink
).unwrap();
89 assert_eq
!(cap
as u64, copied
);
90 assert_eq
!(sink
.len() as u64, copied
);
92 source
.observed_buffer
> DEFAULT_BUF_SIZE
,
93 "expected a large buffer to be provided to the reader, got {}",
94 source
.observed_buffer
99 fn copy_specializes_from_vecdeque() {
100 let mut source
= VecDeque
::with_capacity(100 * 1024);
101 for _
in 0..20 * 1024 {
102 source
.push_front(0);
104 for _
in 0..20 * 1024 {
107 let mut sink
= WriteObserver { observed_buffer: 0 }
;
108 assert_eq
!(40 * 1024u64, io
::copy(&mut source
, &mut sink
).unwrap());
109 assert_eq
!(20 * 1024, sink
.observed_buffer
);
113 fn copy_specializes_from_slice() {
114 let mut source
= [1; 60 * 1024].as_slice();
115 let mut sink
= WriteObserver { observed_buffer: 0 }
;
116 assert_eq
!(60 * 1024u64, io
::copy(&mut source
, &mut sink
).unwrap());
117 assert_eq
!(60 * 1024, sink
.observed_buffer
);
123 use crate::fs
::OpenOptions
;
124 use crate::io
::prelude
::*;
125 use crate::io
::BufReader
;
130 fn bench_copy_buf_reader(b
: &mut Bencher
) {
131 let mut file_in
= File
::open("/dev/zero").expect("opening /dev/zero failed");
132 // use dyn to avoid specializations unrelated to readbuf
133 let dyn_in
= &mut file_in
as &mut dyn Read
;
134 let mut reader
= BufReader
::with_capacity(256 * 1024, dyn_in
.take(0));
136 OpenOptions
::new().write(true).open("/dev/null").expect("opening /dev/null failed");
138 const BYTES
: u64 = 1024 * 1024;
143 reader
.get_mut().set_limit(BYTES
);
144 crate::io
::copy(&mut reader
, &mut writer
).unwrap()