diff options
author | 2022-07-10 20:44:29 +1000 | |
---|---|---|
committer | 2022-07-10 12:44:29 +0200 | |
commit | 068ed41bc02c21fe0a0a4d8e95af8a4668276f5d (patch) | |
tree | ac10afeab37faa38b79af6ee8cec52c38e456306 /src | |
parent | f514bd38dac85695e9053d990b251643e9e4ef92 (diff) | |
download | bytes-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.rs | 37 |
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) { |