aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Jiahao XU <Jiahao_XU@outlook.com> 2022-07-10 20:44:29 +1000
committerGravatar GitHub <noreply@github.com> 2022-07-10 12:44:29 +0200
commit068ed41bc02c21fe0a0a4d8e95af8a4668276f5d (patch)
treeac10afeab37faa38b79af6ee8cec52c38e456306 /src
parentf514bd38dac85695e9053d990b251643e9e4ef92 (diff)
downloadbytes-068ed41bc02c21fe0a0a4d8e95af8a4668276f5d.tar.gz
bytes-068ed41bc02c21fe0a0a4d8e95af8a4668276f5d.tar.zst
bytes-068ed41bc02c21fe0a0a4d8e95af8a4668276f5d.zip
Add conversion from BytesMut to Vec<u8> (#543)
Diffstat (limited to 'src')
-rw-r--r--src/bytes_mut.rs37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/bytes_mut.rs b/src/bytes_mut.rs
index 4f9a885..65f97b4 100644
--- a/src/bytes_mut.rs
+++ b/src/bytes_mut.rs
@@ -1540,6 +1540,43 @@ impl PartialEq<Bytes> for BytesMut {
}
}
+impl From<BytesMut> for Vec<u8> {
+ fn from(mut bytes: BytesMut) -> Self {
+ let kind = bytes.kind();
+
+ let mut vec = if kind == KIND_VEC {
+ unsafe {
+ let (off, _) = bytes.get_vec_pos();
+ rebuild_vec(bytes.ptr.as_ptr(), bytes.len, bytes.cap, off)
+ }
+ } else if kind == KIND_ARC {
+ let shared = unsafe { &mut *(bytes.data as *mut Shared) };
+ if shared.is_unique() {
+ let vec = mem::replace(&mut shared.vec, Vec::new());
+
+ unsafe { release_shared(shared) };
+
+ vec
+ } else {
+ return bytes.deref().into();
+ }
+ } else {
+ return bytes.deref().into();
+ };
+
+ let len = bytes.len;
+
+ unsafe {
+ ptr::copy(bytes.ptr.as_ptr(), vec.as_mut_ptr(), len);
+ vec.set_len(len);
+ }
+
+ mem::forget(bytes);
+
+ vec
+ }
+}
+
#[inline]
fn vptr(ptr: *mut u8) -> NonNull<u8> {
if cfg!(debug_assertions) {