From 220c83e90a1b16e4320d8ec629f616d6affc05af Mon Sep 17 00:00:00 2001 From: "wangjie.wjdew" Date: Thu, 17 Jul 2025 18:03:33 +0800 Subject: [PATCH 1/2] feat: support concat and add check for not adding empty bytes into list --- Cargo.toml | 2 +- src/lib.rs | 42 ++++++++++++++++++++++++++++++++---------- 2 files changed, 33 insertions(+), 11 deletions(-) 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..07a6c23 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -68,6 +68,20 @@ impl LinkedBytes { &mut self.bytes } + #[inline] + pub fn concat(&self) -> Bytes { + 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.freeze() + } + #[inline] pub fn reserve(&mut self, additional: usize) { self.bytes.reserve(additional); @@ -87,20 +101,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> { From e500de60ea7c1434ab5d164a41825c0ea8a90ab8 Mon Sep 17 00:00:00 2001 From: "wangjie.wjdew" Date: Tue, 22 Jul 2025 20:59:28 +0800 Subject: [PATCH 2/2] modify: return BytesMut for the concat api --- src/lib.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 07a6c23..9b44233 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -68,8 +68,9 @@ impl LinkedBytes { &mut self.bytes } + /// This concatenates the list and the bytes into a [`BytesMut`]. #[inline] - pub fn concat(&self) -> Bytes { + 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); @@ -79,7 +80,7 @@ impl LinkedBytes { if !self.bytes.is_empty() { dest.put_slice(&self.bytes); } - dest.freeze() + dest } #[inline]