diff --git a/arrow-buffer/Cargo.toml b/arrow-buffer/Cargo.toml index c1bcd9f6306..c5a81b30f29 100644 --- a/arrow-buffer/Cargo.toml +++ b/arrow-buffer/Cargo.toml @@ -38,7 +38,6 @@ path = "src/lib.rs" bench = false [dependencies] -num = { version = "0.4", default-features = false, features = ["std"] } half = { version = "2.0", default-features = false } [dev-dependencies] diff --git a/arrow-buffer/src/native.rs b/arrow-buffer/src/native.rs index b72cd18bac2..df4376142be 100644 --- a/arrow-buffer/src/native.rs +++ b/arrow-buffer/src/native.rs @@ -46,193 +46,82 @@ mod private { pub trait ArrowNativeType: std::fmt::Debug + Send + Sync + Copy + PartialOrd + Default + private::Sealed + 'static { - /// Convert native type from usize. - #[inline] - fn from_usize(_: usize) -> Option { - None - } + /// Convert native integer type from usize + /// + /// Returns `None` if [`Self`] is not an integer or conversion would result + /// in truncation/overflow + fn from_usize(_: usize) -> Option; /// Convert native type to usize. - #[inline] - fn to_usize(&self) -> Option { - None - } + /// + /// Returns `None` if [`Self`] is not an integer or conversion would result + /// in truncation/overflow + fn to_usize(&self) -> Option; /// Convert native type to isize. - #[inline] - fn to_isize(&self) -> Option { - None - } -} - -impl private::Sealed for i8 {} -impl ArrowNativeType for i8 { - #[inline] - fn from_usize(v: usize) -> Option { - num::FromPrimitive::from_usize(v) - } - - #[inline] - fn to_usize(&self) -> Option { - num::ToPrimitive::to_usize(self) - } - - #[inline] - fn to_isize(&self) -> Option { - num::ToPrimitive::to_isize(self) - } -} - -impl private::Sealed for i16 {} -impl ArrowNativeType for i16 { - #[inline] - fn from_usize(v: usize) -> Option { - num::FromPrimitive::from_usize(v) - } - - #[inline] - fn to_usize(&self) -> Option { - num::ToPrimitive::to_usize(self) - } - - #[inline] - fn to_isize(&self) -> Option { - num::ToPrimitive::to_isize(self) - } -} - -impl private::Sealed for i32 {} -impl ArrowNativeType for i32 { - #[inline] - fn from_usize(v: usize) -> Option { - num::FromPrimitive::from_usize(v) - } - - #[inline] - fn to_usize(&self) -> Option { - num::ToPrimitive::to_usize(self) - } - - #[inline] - fn to_isize(&self) -> Option { - num::ToPrimitive::to_isize(self) - } -} - -impl private::Sealed for i64 {} -impl ArrowNativeType for i64 { - #[inline] - fn from_usize(v: usize) -> Option { - num::FromPrimitive::from_usize(v) - } - - #[inline] - fn to_usize(&self) -> Option { - num::ToPrimitive::to_usize(self) - } - - #[inline] - fn to_isize(&self) -> Option { - num::ToPrimitive::to_isize(self) - } -} - -impl private::Sealed for i128 {} -impl ArrowNativeType for i128 { - #[inline] - fn from_usize(v: usize) -> Option { - num::FromPrimitive::from_usize(v) - } - - #[inline] - fn to_usize(&self) -> Option { - num::ToPrimitive::to_usize(self) - } - - #[inline] - fn to_isize(&self) -> Option { - num::ToPrimitive::to_isize(self) - } -} - -impl private::Sealed for u8 {} -impl ArrowNativeType for u8 { - #[inline] - fn from_usize(v: usize) -> Option { - num::FromPrimitive::from_usize(v) - } - - #[inline] - fn to_usize(&self) -> Option { - num::ToPrimitive::to_usize(self) - } - - #[inline] - fn to_isize(&self) -> Option { - num::ToPrimitive::to_isize(self) - } + /// + /// Returns `None` if [`Self`] is not an integer or conversion would result + /// in truncation/overflow + fn to_isize(&self) -> Option; } -impl private::Sealed for u16 {} -impl ArrowNativeType for u16 { - #[inline] - fn from_usize(v: usize) -> Option { - num::FromPrimitive::from_usize(v) - } - - #[inline] - fn to_usize(&self) -> Option { - num::ToPrimitive::to_usize(self) - } - - #[inline] - fn to_isize(&self) -> Option { - num::ToPrimitive::to_isize(self) - } -} - -impl private::Sealed for u32 {} -impl ArrowNativeType for u32 { - #[inline] - fn from_usize(v: usize) -> Option { - num::FromPrimitive::from_usize(v) - } - - #[inline] - fn to_usize(&self) -> Option { - num::ToPrimitive::to_usize(self) - } - - #[inline] - fn to_isize(&self) -> Option { - num::ToPrimitive::to_isize(self) - } +macro_rules! native_integer { + ($t: ty) => { + impl private::Sealed for $t {} + impl ArrowNativeType for $t { + #[inline] + fn from_usize(v: usize) -> Option { + v.try_into().ok() + } + + #[inline] + fn to_usize(&self) -> Option { + (*self).try_into().ok() + } + + #[inline] + fn to_isize(&self) -> Option { + (*self).try_into().ok() + } + } + }; } -impl private::Sealed for u64 {} -impl ArrowNativeType for u64 { - #[inline] - fn from_usize(v: usize) -> Option { - num::FromPrimitive::from_usize(v) - } - - #[inline] - fn to_usize(&self) -> Option { - num::ToPrimitive::to_usize(self) - } - - #[inline] - fn to_isize(&self) -> Option { - num::ToPrimitive::to_isize(self) - } +native_integer!(i8); +native_integer!(i16); +native_integer!(i32); +native_integer!(i64); +native_integer!(i128); +native_integer!(u8); +native_integer!(u16); +native_integer!(u32); +native_integer!(u64); + +macro_rules! native_float { + ($t:ty) => { + impl private::Sealed for $t {} + impl ArrowNativeType for $t { + #[inline] + fn from_usize(_: usize) -> Option { + None + } + + #[inline] + fn to_usize(&self) -> Option { + None + } + + #[inline] + fn to_isize(&self) -> Option { + None + } + } + }; } -impl ArrowNativeType for f16 {} -impl private::Sealed for f16 {} -impl ArrowNativeType for f32 {} -impl private::Sealed for f32 {} -impl ArrowNativeType for f64 {} -impl private::Sealed for f64 {} +native_float!(f16); +native_float!(f32); +native_float!(f64); /// Allows conversion from supported Arrow types to a byte slice. pub trait ToByteSlice { diff --git a/arrow-buffer/src/util/bit_util.rs b/arrow-buffer/src/util/bit_util.rs index 5752c5df972..de4bc96f9da 100644 --- a/arrow-buffer/src/util/bit_util.rs +++ b/arrow-buffer/src/util/bit_util.rs @@ -17,7 +17,6 @@ //! Utils for working with bits -use num::Integer; #[cfg(feature = "simd")] use packed_simd::u8x64; @@ -102,7 +101,7 @@ pub unsafe fn unset_bit_raw(data: *mut u8, i: usize) { pub fn ceil(value: usize, divisor: usize) -> usize { // Rewrite as `value.div_ceil(&divisor)` after // https://github.com/rust-lang/rust/issues/88581 is merged. - Integer::div_ceil(&value, &divisor) + value / divisor + (0 != value % divisor) as usize } /// Performs SIMD bitwise binary operations.