diff --git a/Cargo.toml b/Cargo.toml index bf3481c..4231c52 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "linkedbytes" -version = "0.1.13" +version = "0.1.14" authors = ["Volo Team "] edition = "2021" description = "LinkedBytes is a linked list of Bytes and BytesMut." diff --git a/src/lib.rs b/src/lib.rs index 6ee5d47..9b44233 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -68,6 +68,21 @@ impl LinkedBytes { &mut self.bytes } + /// This concatenates the list and the bytes into a [`BytesMut`]. + #[inline] + pub fn concat(&self) -> BytesMut { + let list_len: usize = self.iter_list().map(|node| node.as_ref().len()).sum(); + let total_len = list_len + self.bytes.len(); + let mut dest = BytesMut::with_capacity(total_len); + for node in &self.list { + dest.put_slice(node.as_ref()); + } + if !self.bytes.is_empty() { + dest.put_slice(&self.bytes); + } + dest + } + #[inline] pub fn reserve(&mut self, additional: usize) { self.bytes.reserve(additional); @@ -87,20 +102,28 @@ impl LinkedBytes { pub fn insert(&mut self, bytes: Bytes) { let node = Node::Bytes(bytes); - // split current bytes - let prev = self.bytes.split(); - - self.list.push_back(Node::BytesMut(prev)); - self.list.push_back(node); + if self.bytes.is_empty() { + self.list.push_back(node); + } else { + // split current bytes + let prev = self.bytes.split(); + + self.list.push_back(Node::BytesMut(prev)); + self.list.push_back(node); + } } pub fn insert_faststr(&mut self, fast_str: FastStr) { let node = Node::FastStr(fast_str); - // split current bytes - let prev = self.bytes.split(); - - self.list.push_back(Node::BytesMut(prev)); - self.list.push_back(node); + if self.bytes.is_empty() { + self.list.push_back(node); + } else { + // split current bytes + let prev = self.bytes.split(); + + self.list.push_back(Node::BytesMut(prev)); + self.list.push_back(node); + } } pub fn io_slice(&self) -> Vec> {