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();