diff options
author | 2019-11-04 17:23:40 -0800 | |
---|---|---|
committer | 2019-11-04 17:23:40 -0800 | |
commit | 856ed7c43de8eca457cc5e00b7fdcc3edeb4c52a (patch) | |
tree | d4148bf7ba016d8ec25f083c0c6ac11891fb6c90 | |
parent | 96268a80d44db04142ff168506e9bff8682d9a15 (diff) | |
download | bytes-856ed7c43de8eca457cc5e00b7fdcc3edeb4c52a.tar.gz bytes-856ed7c43de8eca457cc5e00b7fdcc3edeb4c52a.tar.zst bytes-856ed7c43de8eca457cc5e00b7fdcc3edeb4c52a.zip |
implement Buf for std::io::Cursor (#308)
-rw-r--r-- | src/buf/buf_impl.rs | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/buf/buf_impl.rs b/src/buf/buf_impl.rs index 99ecb54..9ba1269 100644 --- a/src/buf/buf_impl.rs +++ b/src/buf/buf_impl.rs @@ -892,6 +892,39 @@ impl Buf for Option<[u8; 1]> { } } +#[cfg(feature = "std")] +impl<T: AsRef<[u8]>> Buf for std::io::Cursor<T> { + fn remaining(&self) -> usize { + let len = self.get_ref().as_ref().len(); + let pos = self.position(); + + if pos >= len as u64 { + return 0; + } + + len - pos as usize + } + + fn bytes(&self) -> &[u8] { + let len = self.get_ref().as_ref().len(); + let pos = self.position(); + + if pos >= len as u64 { + return &[]; + } + + &self.get_ref().as_ref()[pos as usize..] + } + + fn advance(&mut self, cnt: usize) { + let pos = (self.position() as usize) + .checked_add(cnt).expect("overflow"); + + assert!(pos <= self.get_ref().as_ref().len()); + self.set_position(pos as u64); + } +} + // The existence of this function makes the compiler catch if the Buf // trait is "object-safe" or not. fn _assert_trait_object(_b: &dyn Buf) {} |