This is an automated email from the ASF dual-hosted git repository.

tustvold pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git


The following commit(s) were added to refs/heads/master by this push:
     new bcc04a40fd impl `From<Vec<T>>` for `BufferBuilder` and `MutableBuffer` 
(#4650)
bcc04a40fd is described below

commit bcc04a40fdc8d24d201f82a53f79a7b80b3a74fb
Author: Matthijs Brobbel <[email protected]>
AuthorDate: Sun Aug 6 14:58:57 2023 +0200

    impl `From<Vec<T>>` for `BufferBuilder` and `MutableBuffer` (#4650)
    
    * impl `From<Vec<T>>` for `BufferBuilder` and `MutableBuffer`
    
    * Deprecate `MutableBuffer::from_vec`
---
 arrow-buffer/src/buffer/immutable.rs |  2 +-
 arrow-buffer/src/buffer/mutable.rs   | 27 +++++++++++++++++----------
 arrow-buffer/src/builder/mod.rs      |  6 ++++++
 3 files changed, 24 insertions(+), 11 deletions(-)

diff --git a/arrow-buffer/src/buffer/immutable.rs 
b/arrow-buffer/src/buffer/immutable.rs
index 2ecd3b4191..8296d3fbcc 100644
--- a/arrow-buffer/src/buffer/immutable.rs
+++ b/arrow-buffer/src/buffer/immutable.rs
@@ -74,7 +74,7 @@ impl Buffer {
     /// Create a [`Buffer`] from the provided [`Vec`] without copying
     #[inline]
     pub fn from_vec<T: ArrowNativeType>(vec: Vec<T>) -> Self {
-        MutableBuffer::from_vec(vec).into()
+        MutableBuffer::from(vec).into()
     }
 
     /// Initializes a [Buffer] from a slice of items.
diff --git a/arrow-buffer/src/buffer/mutable.rs 
b/arrow-buffer/src/buffer/mutable.rs
index 0177582b0b..2c56f9a5b2 100644
--- a/arrow-buffer/src/buffer/mutable.rs
+++ b/arrow-buffer/src/buffer/mutable.rs
@@ -112,17 +112,9 @@ impl MutableBuffer {
 
     /// Create a [`MutableBuffer`] from the provided [`Vec`] without copying
     #[inline]
+    #[deprecated(note = "Use From<Vec<T>>")]
     pub fn from_vec<T: ArrowNativeType>(vec: Vec<T>) -> Self {
-        // Safety
-        // Vec::as_ptr guaranteed to not be null and ArrowNativeType are 
trivially transmutable
-        let data = unsafe { NonNull::new_unchecked(vec.as_ptr() as _) };
-        let len = vec.len() * mem::size_of::<T>();
-        // Safety
-        // Vec guaranteed to have a valid layout matching that of 
`Layout::array`
-        // This is based on `RawVec::current_memory`
-        let layout = unsafe { 
Layout::array::<T>(vec.capacity()).unwrap_unchecked() };
-        mem::forget(vec);
-        Self { data, len, layout }
+        Self::from(vec)
     }
 
     /// Allocates a new [MutableBuffer] from given `Bytes`.
@@ -502,6 +494,21 @@ impl<A: ArrowNativeType> Extend<A> for MutableBuffer {
     }
 }
 
+impl<T: ArrowNativeType> From<Vec<T>> for MutableBuffer {
+    fn from(value: Vec<T>) -> Self {
+        // Safety
+        // Vec::as_ptr guaranteed to not be null and ArrowNativeType are 
trivially transmutable
+        let data = unsafe { NonNull::new_unchecked(value.as_ptr() as _) };
+        let len = value.len() * mem::size_of::<T>();
+        // Safety
+        // Vec guaranteed to have a valid layout matching that of 
`Layout::array`
+        // This is based on `RawVec::current_memory`
+        let layout = unsafe { 
Layout::array::<T>(value.capacity()).unwrap_unchecked() };
+        mem::forget(value);
+        Self { data, len, layout }
+    }
+}
+
 impl MutableBuffer {
     #[inline]
     pub(super) fn extend_from_iter<T: ArrowNativeType, I: Iterator<Item = T>>(
diff --git a/arrow-buffer/src/builder/mod.rs b/arrow-buffer/src/builder/mod.rs
index 464f9a202c..d5d5a7d3f1 100644
--- a/arrow-buffer/src/builder/mod.rs
+++ b/arrow-buffer/src/builder/mod.rs
@@ -372,6 +372,12 @@ impl<T: ArrowNativeType> Extend<T> for BufferBuilder<T> {
     }
 }
 
+impl<T: ArrowNativeType> From<Vec<T>> for BufferBuilder<T> {
+    fn from(value: Vec<T>) -> Self {
+        Self::new_from_buffer(MutableBuffer::from(value))
+    }
+}
+
 impl<T: ArrowNativeType> FromIterator<T> for BufferBuilder<T> {
     fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
         let mut builder = Self::default();

Reply via email to