aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Sean McArthur <sean@seanmonstar.com> 2019-11-04 17:23:40 -0800
committerGravatar GitHub <noreply@github.com> 2019-11-04 17:23:40 -0800
commit856ed7c43de8eca457cc5e00b7fdcc3edeb4c52a (patch)
treed4148bf7ba016d8ec25f083c0c6ac11891fb6c90
parent96268a80d44db04142ff168506e9bff8682d9a15 (diff)
downloadbytes-856ed7c43de8eca457cc5e00b7fdcc3edeb4c52a.tar.gz
bytes-856ed7c43de8eca457cc5e00b7fdcc3edeb4c52a.tar.zst
bytes-856ed7c43de8eca457cc5e00b7fdcc3edeb4c52a.zip
implement Buf for std::io::Cursor (#308)
-rw-r--r--src/buf/buf_impl.rs33
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) {}