Skip to content

Commit

Permalink
Seal ArrowNativeType and OffsetSizeTrait (#1028) (#1819)
Browse files Browse the repository at this point in the history
* Seal ArrowNativeType (#1028)

* Add docs
  • Loading branch information
tustvold committed Jun 8, 2022
1 parent 1d31d30 commit ba38ebe
Showing 1 changed file with 34 additions and 0 deletions.
34 changes: 34 additions & 0 deletions arrow/src/datatypes/native.rs
Expand Up @@ -19,15 +19,36 @@ use super::DataType;
use half::f16;
use serde_json::{Number, Value};

mod private {
pub trait Sealed {}
}

/// Trait declaring any type that is serializable to JSON. This includes all primitive types (bool, i32, etc.).
pub trait JsonSerializable: 'static {
fn into_json_value(self) -> Option<Value>;
}

/// Trait expressing a Rust type that has the same in-memory representation
/// as Arrow. This includes `i16`, `f32`, but excludes `bool` (which in arrow is represented in bits).
///
/// In little endian machines, types that implement [`ArrowNativeType`] can be memcopied to arrow buffers
/// as is.
///
/// # Transmute Safety
///
/// A type T implementing this trait means that any arbitrary slice of bytes of length and
/// alignment `size_of::<T>()` can be safely interpreted as a value of that type without
/// being unsound, i.e. potentially resulting in undefined behaviour.
///
/// Note: in the case of floating point numbers this transmutation can result in a signalling
/// NaN, which, whilst sound, can be unwieldy. In general, whilst it is perfectly sound to
/// reinterpret bytes as different types using this trait, it is likely unwise
///
/// Note: `bool` is restricted to `0` or `1`, and so `bool: !ArrowNativeType`
///
/// # Sealed
///
/// Due to the above restrictions, this trait is sealed to prevent accidental misuse
pub trait ArrowNativeType:
std::fmt::Debug
+ Send
Expand All @@ -37,6 +58,7 @@ pub trait ArrowNativeType:
+ std::str::FromStr
+ Default
+ JsonSerializable
+ private::Sealed
{
/// Convert native type from usize.
#[inline]
Expand Down Expand Up @@ -109,6 +131,7 @@ impl JsonSerializable for i8 {
}
}

impl private::Sealed for i8 {}
impl ArrowNativeType for i8 {
#[inline]
fn from_usize(v: usize) -> Option<Self> {
Expand All @@ -132,6 +155,7 @@ impl JsonSerializable for i16 {
}
}

impl private::Sealed for i16 {}
impl ArrowNativeType for i16 {
#[inline]
fn from_usize(v: usize) -> Option<Self> {
Expand All @@ -155,6 +179,7 @@ impl JsonSerializable for i32 {
}
}

impl private::Sealed for i32 {}
impl ArrowNativeType for i32 {
#[inline]
fn from_usize(v: usize) -> Option<Self> {
Expand Down Expand Up @@ -184,6 +209,7 @@ impl JsonSerializable for i64 {
}
}

impl private::Sealed for i64 {}
impl ArrowNativeType for i64 {
#[inline]
fn from_usize(v: usize) -> Option<Self> {
Expand Down Expand Up @@ -217,6 +243,7 @@ impl JsonSerializable for i128 {
}
}

impl private::Sealed for i128 {}
impl ArrowNativeType for i128 {
#[inline]
fn from_usize(v: usize) -> Option<Self> {
Expand Down Expand Up @@ -246,6 +273,7 @@ impl JsonSerializable for u8 {
}
}

impl private::Sealed for u8 {}
impl ArrowNativeType for u8 {
#[inline]
fn from_usize(v: usize) -> Option<Self> {
Expand All @@ -269,6 +297,7 @@ impl JsonSerializable for u16 {
}
}

impl private::Sealed for u16 {}
impl ArrowNativeType for u16 {
#[inline]
fn from_usize(v: usize) -> Option<Self> {
Expand All @@ -292,6 +321,7 @@ impl JsonSerializable for u32 {
}
}

impl private::Sealed for u32 {}
impl ArrowNativeType for u32 {
#[inline]
fn from_usize(v: usize) -> Option<Self> {
Expand All @@ -315,6 +345,7 @@ impl JsonSerializable for u64 {
}
}

impl private::Sealed for u64 {}
impl ArrowNativeType for u64 {
#[inline]
fn from_usize(v: usize) -> Option<Self> {
Expand Down Expand Up @@ -351,8 +382,11 @@ impl JsonSerializable for f64 {
}

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 {}

/// Allows conversion from supported Arrow types to a byte slice.
pub trait ToByteSlice {
Expand Down

0 comments on commit ba38ebe

Please sign in to comment.