From f841880623f85a0c7ffdc2326596935785415be7 Mon Sep 17 00:00:00 2001 From: Xiangpeng Hao Date: Thu, 11 Jul 2024 11:08:41 -0400 Subject: [PATCH 1/3] deprecate auto copy, ask explicit reference --- arrow-buffer/src/buffer/immutable.rs | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/arrow-buffer/src/buffer/immutable.rs b/arrow-buffer/src/buffer/immutable.rs index 52e201ca15a2..a1ba4c45a448 100644 --- a/arrow-buffer/src/buffer/immutable.rs +++ b/arrow-buffer/src/buffer/immutable.rs @@ -356,16 +356,21 @@ impl Buffer { } } -/// Creating a `Buffer` instance by copying the memory from a `AsRef<[u8]>` into a newly -/// allocated memory region. -impl> From for Buffer { - fn from(p: T) -> Self { - // allocate aligned memory buffer - let slice = p.as_ref(); - let len = slice.len(); - let mut buffer = MutableBuffer::new(len); - buffer.extend_from_slice(slice); - buffer.into() +impl From<&[u8]> for Buffer { + fn from(p: &[u8]) -> Self { + Self::from_slice_ref(p) + } +} + +impl From<[u8; N]> for Buffer { + fn from(p: [u8; N]) -> Self { + Self::from_slice_ref(p) + } +} + +impl From<&[u8; N]> for Buffer { + fn from(p: &[u8; N]) -> Self { + Self::from_slice_ref(p) } } From b14698f76d03e79034723d50ddd3c4ddf3438ed1 Mon Sep 17 00:00:00 2001 From: Xiangpeng Hao Date: Sat, 13 Jul 2024 14:00:21 -0400 Subject: [PATCH 2/3] update comments --- arrow-buffer/src/buffer/immutable.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/arrow-buffer/src/buffer/immutable.rs b/arrow-buffer/src/buffer/immutable.rs index a1ba4c45a448..9d0e486b1111 100644 --- a/arrow-buffer/src/buffer/immutable.rs +++ b/arrow-buffer/src/buffer/immutable.rs @@ -356,6 +356,14 @@ impl Buffer { } } +/// Note that here we deliberately do not implement +/// `impl> From for Buffer` +/// As it would accept `Buffer::from(vec![...])` that would cause an unexpected copy. +/// Instead, we ask user to be explicit when copying is occurring, e.g., `Buffer::from(vec![...].to_byte_slice())`. +/// For zero-copy conversion, user should use `Buffer::from_vec(vec![...])`. +/// +/// Since we removed impl for `AsRef`, we added the following three specific implementations to reduce API breakage. +/// See https://github.com/apache/arrow-rs/issues/6033 for more discussion on this. impl From<&[u8]> for Buffer { fn from(p: &[u8]) -> Self { Self::from_slice_ref(p) From 468ba571f009c786cbc3b0481df704c041353b21 Mon Sep 17 00:00:00 2001 From: Xiangpeng Hao Date: Sat, 13 Jul 2024 14:05:05 -0400 Subject: [PATCH 3/3] make cargo doc happy --- arrow-buffer/src/buffer/immutable.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arrow-buffer/src/buffer/immutable.rs b/arrow-buffer/src/buffer/immutable.rs index 9d0e486b1111..c53ef18ba58f 100644 --- a/arrow-buffer/src/buffer/immutable.rs +++ b/arrow-buffer/src/buffer/immutable.rs @@ -363,7 +363,7 @@ impl Buffer { /// For zero-copy conversion, user should use `Buffer::from_vec(vec![...])`. /// /// Since we removed impl for `AsRef`, we added the following three specific implementations to reduce API breakage. -/// See https://github.com/apache/arrow-rs/issues/6033 for more discussion on this. +/// See for more discussion on this. impl From<&[u8]> for Buffer { fn from(p: &[u8]) -> Self { Self::from_slice_ref(p)