From a4bfc63de7ca923ac5e03dc3a14a16c9aa45d23d Mon Sep 17 00:00:00 2001 From: Carl Lerche <me@carllerche.com> Date: Fri, 7 Oct 2016 15:37:12 -0700 Subject: [PATCH] Tweak Sink / Source --- src/imp/buf/mod.rs | 57 +++++++++++++++---------------------------- src/imp/bytes/rope.rs | 8 +++--- test/test_buf.rs | 2 +- test/test_rope.rs | 2 ++ 4 files changed, 26 insertions(+), 43 deletions(-) diff --git a/src/imp/buf/mod.rs b/src/imp/buf/mod.rs index 8c7644f..31c2ceb 100644 --- a/src/imp/buf/mod.rs +++ b/src/imp/buf/mod.rs @@ -27,10 +27,10 @@ pub trait Buf { self.remaining() > 0 } - fn copy_to<S: Sink>(&mut self, dst: S) -> usize + fn copy_to<S: Sink + ?Sized>(&mut self, dst: &mut S) -> usize where Self: Sized { let rem = self.remaining(); - dst.copy_from(self); + dst.sink(self); rem - self.remaining() } @@ -206,7 +206,7 @@ pub trait MutBuf { fn copy_from<S: Source>(&mut self, src: S) -> usize where Self: Sized { let rem = self.remaining(); - src.copy_to(self); + src.source(self); rem - self.remaining() } @@ -440,36 +440,37 @@ impl<'a> IntoBuf for &'a () { /// A value that writes bytes from itself into a `MutBuf`. pub trait Source { - fn copy_to<B: MutBuf>(self, buf: &mut B); + /// Copy data from self into destination buffer + fn source<B: MutBuf>(self, buf: &mut B); } impl<'a> Source for &'a [u8] { - fn copy_to<B: MutBuf>(self, buf: &mut B) { + fn source<B: MutBuf>(self, buf: &mut B) { buf.write_slice(self); } } impl Source for u8 { - fn copy_to<B: MutBuf>(self, buf: &mut B) { + fn source<B: MutBuf>(self, buf: &mut B) { let src = [self]; buf.write_slice(&src); } } impl Source for Bytes { - fn copy_to<B: MutBuf>(self, buf: &mut B) { - Source::copy_to(&self, buf); + fn source<B: MutBuf>(self, buf: &mut B) { + Source::source(&self, buf); } } impl<'a> Source for &'a Bytes { - fn copy_to<B: MutBuf>(self, buf: &mut B) { - Source::copy_to(self.buf(), buf); + fn source<B: MutBuf>(self, buf: &mut B) { + Source::source(&mut self.buf(), buf); } } -impl<T: Buf> Source for T { - fn copy_to<B: MutBuf>(mut self, buf: &mut B) { +impl<'a, T: Buf> Source for &'a mut T { + fn source<B: MutBuf>(mut self, buf: &mut B) { while self.has_remaining() && buf.has_remaining() { let l; @@ -491,38 +492,18 @@ impl<T: Buf> Source for T { } pub trait Sink { - fn copy_from<B: Buf>(self, buf: &mut B); + fn sink<B: Buf>(&mut self, buf: &mut B); } -impl<'a> Sink for &'a mut [u8] { - fn copy_from<B: Buf>(self, buf: &mut B) { +impl Sink for [u8] { + fn sink<B: Buf>(&mut self, buf: &mut B) { buf.read_slice(self); } } -impl<'a> Sink for &'a mut Vec<u8> { - fn copy_from<B: Buf>(self, buf: &mut B) { - use std::slice; - - self.clear(); - - let rem = buf.remaining(); - - // Ensure that the vec is big enough - if rem > self.capacity() { - // current length is 0, so reserve completely - self.reserve(rem); - } - debug_assert!(rem <= self.capacity()); - - unsafe { - { - let dst = &mut self[..]; - buf.read_slice(slice::from_raw_parts_mut(dst.as_mut_ptr(), rem)); - } - - self.set_len(rem); - } +impl<T: MutBuf> Sink for T { + fn sink<B: Buf>(&mut self, buf: &mut B) { + Source::source(buf, self) } } diff --git a/src/imp/bytes/rope.rs b/src/imp/bytes/rope.rs index d72eeb4..18bdb47 100644 --- a/src/imp/bytes/rope.rs +++ b/src/imp/bytes/rope.rs @@ -285,11 +285,11 @@ impl Node { } impl<'a> Source for &'a Node { - fn copy_to<B: MutBuf>(self, buf: &mut B) { + fn source<B: MutBuf>(self, buf: &mut B) { match *self { - Node::Seq(ref b) => b.as_slice().copy_to(buf), - Node::Small(ref b) => b.as_ref().copy_to(buf), - Node::Rope(ref b) => b.buf().copy_to(buf), + Node::Seq(ref b) => b.as_slice().source(buf), + Node::Small(ref b) => b.as_ref().source(buf), + Node::Rope(ref b) => b.buf().source(buf), Node::Empty => unreachable!(), } } diff --git a/test/test_buf.rs b/test/test_buf.rs index 1385de6..07ba633 100644 --- a/test/test_buf.rs +++ b/test/test_buf.rs @@ -54,6 +54,6 @@ fn test_vec_sink_capacity() { sink.reserve(16); assert!(sink.capacity() >= 16, "Capacity {} must be at least 16", sink.capacity()); let mut source = Cursor::new(b"0123456789abcdef0123456789abcdef"); - sink.copy_from(&mut source); + sink.sink(&mut source); assert!(sink.len() <= sink.capacity(), "Length {} must be less than or equal to capacity {}", sink.len(), sink.capacity()); } diff --git a/test/test_rope.rs b/test/test_rope.rs index 0334fd8..e32dced 100644 --- a/test/test_rope.rs +++ b/test/test_rope.rs @@ -38,12 +38,14 @@ pub fn test_rope_slice() { let left = bytes.slice_to(250); assert_eq!(250, left.len()); + dst.clear(); left.buf().copy_to(&mut dst); assert_eq!(dst, &TEST_BYTES_1[..250]); let right = bytes.slice_from(250); assert_eq!(TEST_BYTES_1.len() - 250, right.len()); + dst.clear(); right.buf().copy_to(&mut dst); // assert_eq!(dst, &TEST_BYTES_1[250..]); } -- GitLab