aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/buf/mod.rs1
-rw-r--r--src/buf/vec_deque.rs39
2 files changed, 40 insertions, 0 deletions
diff --git a/src/buf/mod.rs b/src/buf/mod.rs
index 1f74e0a..35b4857 100644
--- a/src/buf/mod.rs
+++ b/src/buf/mod.rs
@@ -24,6 +24,7 @@ mod into_buf;
mod iter;
mod reader;
mod take;
+mod vec_deque;
mod writer;
pub use self::buf::Buf;
diff --git a/src/buf/vec_deque.rs b/src/buf/vec_deque.rs
new file mode 100644
index 0000000..1cd650f
--- /dev/null
+++ b/src/buf/vec_deque.rs
@@ -0,0 +1,39 @@
+use std::collections::VecDeque;
+
+use super::Buf;
+
+impl Buf for VecDeque<u8> {
+ fn remaining(&self) -> usize {
+ self.len()
+ }
+
+ fn bytes(&self) -> &[u8] {
+ let (s1, s2) = self.as_slices();
+ if s1.is_empty() {
+ s2
+ } else {
+ s1
+ }
+ }
+
+ fn advance(&mut self, cnt: usize) {
+ self.drain(..cnt);
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn hello_world() {
+ let mut buffer: VecDeque<u8> = VecDeque::new();
+ buffer.extend(b"hello world");
+ assert_eq!(11, buffer.remaining());
+ assert_eq!(b"hello world", buffer.bytes());
+ buffer.advance(6);
+ assert_eq!(b"world", buffer.bytes());
+ buffer.extend(b" piece");
+ assert_eq!(b"world piece" as &[u8], &buffer.collect::<Vec<u8>>()[..]);
+ }
+}