diff options
author | Justus Winter <justus@sequoia-pgp.org> | 2022-06-14 12:10:58 +0200 |
---|---|---|
committer | Justus Winter <justus@sequoia-pgp.org> | 2022-06-15 09:59:17 +0200 |
commit | 196ec31eb208e5ac41ef781ed57e025d54e96778 (patch) | |
tree | 2f09da4067eab50c8adc959518d01e1d1660d7ff | |
parent | ca00772c00e9cd2ef877f2f5cce232df6a346cd2 (diff) |
This blanket implementation for &mut T where T: BufferedReader doesn't work.justus/fix-723-surprise
-rw-r--r-- | buffered-reader/src/lib.rs | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/buffered-reader/src/lib.rs b/buffered-reader/src/lib.rs index 1cabb65b..30b381e3 100644 --- a/buffered-reader/src/lib.rs +++ b/buffered-reader/src/lib.rs @@ -1089,6 +1089,58 @@ where } } +// XXX: This doesn't work: +/// Make a `&mut T where T: BufferedReader` look like a BufferedReader. +impl<'a, T, C> BufferedReader<C> for &mut T +where + T: BufferedReader<C>, + C: Default + fmt::Debug + Send + Sync, // XXX: Note the additional constraint +{ + fn buffer(&self) -> &[u8] { + (**self).buffer() + } + + fn data(&mut self, amount: usize) -> Result<&[u8], io::Error> { + (**self).data(amount) + } + + fn consume(&mut self, amount: usize) -> &[u8] { + (**self).consume(amount) + } + + fn get_mut(&mut self) -> Option<&mut dyn BufferedReader<C>> { + (**self).get_mut() + } + + fn get_ref(&self) -> Option<&dyn BufferedReader<C>> { + (**self).get_ref() + } + + fn as_boxed<'b>(self) -> Box<dyn BufferedReader<C> + 'b> + where Self: 'b + { + Box::new(self) + } + + /// This will always return `None`. + fn into_inner<'b>(self: Box<Self>) -> Option<Box<dyn BufferedReader<C> + 'b>> + where Self: 'b { + None + } + + fn cookie_set(&mut self, cookie: C) -> C { + (**self).cookie_set(cookie) + } + + fn cookie_ref(&self) -> &C { + (**self).cookie_ref() + } + + fn cookie_mut(&mut self) -> &mut C { + (**self).cookie_mut() + } +} + // The file was created as follows: // // for i in $(seq 0 9999); do printf "%04d\n" $i; done > buffered-reader-test.txt |