1515
1616mod ffi;
1717pub ( crate ) mod fmt;
18+ mod from;
1819mod iterator;
1920mod mutable;
2021mod view;
@@ -23,6 +24,7 @@ mod private {
2324 pub trait Sealed : Send + Sync { }
2425
2526 impl Sealed for str { }
27+
2628 impl Sealed for [ u8 ] { }
2729}
2830
@@ -33,6 +35,7 @@ use std::sync::atomic::AtomicU64;
3335use std:: sync:: atomic:: Ordering ;
3436use std:: sync:: Arc ;
3537
38+ use either:: Either ;
3639pub use iterator:: BinaryViewValueIter ;
3740pub use mutable:: MutableBinaryViewArray ;
3841use private:: Sealed ;
@@ -157,6 +160,7 @@ impl<T: ViewType + ?Sized> Clone for BinaryViewArrayGeneric<T> {
157160}
158161
159162unsafe impl < T : ViewType + ?Sized > Send for BinaryViewArrayGeneric < T > { }
163+
160164unsafe impl < T : ViewType + ?Sized > Sync for BinaryViewArrayGeneric < T > { }
161165
162166fn buffers_into_raw < T > ( buffers : & [ Buffer < T > ] ) -> Arc < [ ( * const T , usize ) ] > {
@@ -233,6 +237,11 @@ impl<T: ViewType + ?Sized> BinaryViewArrayGeneric<T> {
233237 buffers : Arc < [ Buffer < u8 > ] > ,
234238 validity : Option < Bitmap > ,
235239 ) -> Result < Self > {
240+ if data_type. to_physical_type ( ) != Self :: default_data_type ( ) . to_physical_type ( ) {
241+ return Err ( Error :: oos (
242+ "BinaryViewArray can only be initialized with DataType::BinaryView or DataType::Utf8View" ,
243+ ) ) ;
244+ }
236245 if T :: IS_UTF8 {
237246 validate_utf8_view ( views. as_ref ( ) , buffers. as_ref ( ) ) ?;
238247 } else {
@@ -254,6 +263,12 @@ impl<T: ViewType + ?Sized> BinaryViewArrayGeneric<T> {
254263 }
255264 }
256265
266+ /// Returns a new [`BinaryViewArrayGeneric`] from a slice of `&T`.
267+ // Note: this can't be `impl From` because Rust does not allow double `AsRef` on it.
268+ pub fn from < V : AsRef < T > , P : AsRef < [ Option < V > ] > > ( slice : P ) -> Self {
269+ MutableBinaryViewArray :: < T > :: from ( slice) . into ( )
270+ }
271+
257272 /// Creates an empty [`BinaryViewArrayGeneric`], i.e. whose `.len` is zero.
258273 #[ inline]
259274 pub fn new_empty ( data_type : DataType ) -> Self {
@@ -438,6 +453,84 @@ impl<T: ViewType + ?Sized> BinaryViewArrayGeneric<T> {
438453 total_buffer_len : self . total_buffer_len ,
439454 }
440455 }
456+
457+ #[ must_use]
458+ pub fn into_mut ( self ) -> Either < Self , MutableBinaryViewArray < T > > {
459+ use Either :: * ;
460+ let is_unique = ( Arc :: strong_count ( & self . buffers ) + Arc :: weak_count ( & self . buffers ) ) == 1 ;
461+
462+ if let Some ( bitmap) = self . validity {
463+ match bitmap. into_mut ( ) {
464+ Left ( bitmap) => Left ( Self :: new_unchecked (
465+ self . data_type ,
466+ self . views ,
467+ self . buffers ,
468+ Some ( bitmap) ,
469+ self . total_bytes_len . load ( Ordering :: Relaxed ) as usize ,
470+ self . total_buffer_len ,
471+ ) ) ,
472+ Right ( mutable_bitmap) => match ( self . views . into_mut ( ) , is_unique) {
473+ ( Right ( views) , true ) => Right ( MutableBinaryViewArray {
474+ views,
475+ completed_buffers : self . buffers . to_vec ( ) ,
476+ in_progress_buffer : vec ! [ ] ,
477+ validity : Some ( mutable_bitmap) ,
478+ phantom : Default :: default ( ) ,
479+ total_bytes_len : self . total_bytes_len . load ( Ordering :: Relaxed ) as usize ,
480+ total_buffer_len : self . total_buffer_len ,
481+ } ) ,
482+ ( Right ( views) , false ) => Left ( Self :: new_unchecked (
483+ self . data_type ,
484+ views. into ( ) ,
485+ self . buffers ,
486+ Some ( mutable_bitmap. into ( ) ) ,
487+ self . total_bytes_len . load ( Ordering :: Relaxed ) as usize ,
488+ self . total_buffer_len ,
489+ ) ) ,
490+ ( Left ( views) , _) => Left ( Self :: new_unchecked (
491+ self . data_type ,
492+ views,
493+ self . buffers ,
494+ Some ( mutable_bitmap. into ( ) ) ,
495+ self . total_bytes_len . load ( Ordering :: Relaxed ) as usize ,
496+ self . total_buffer_len ,
497+ ) ) ,
498+ } ,
499+ }
500+ } else {
501+ match ( self . views . into_mut ( ) , is_unique) {
502+ ( Right ( views) , true ) => Right ( MutableBinaryViewArray {
503+ views,
504+ completed_buffers : self . buffers . to_vec ( ) ,
505+ in_progress_buffer : vec ! [ ] ,
506+ validity : None ,
507+ phantom : Default :: default ( ) ,
508+ total_bytes_len : self . total_bytes_len . load ( Ordering :: Relaxed ) as usize ,
509+ total_buffer_len : self . total_buffer_len ,
510+ } ) ,
511+ ( Right ( views) , false ) => Left ( Self :: new_unchecked (
512+ self . data_type ,
513+ views. into ( ) ,
514+ self . buffers ,
515+ None ,
516+ self . total_bytes_len . load ( Ordering :: Relaxed ) as usize ,
517+ self . total_buffer_len ,
518+ ) ) ,
519+ ( Left ( views) , _) => Left ( Self :: new_unchecked (
520+ self . data_type ,
521+ views,
522+ self . buffers ,
523+ None ,
524+ self . total_bytes_len . load ( Ordering :: Relaxed ) as usize ,
525+ self . total_buffer_len ,
526+ ) ) ,
527+ }
528+ }
529+ }
530+
531+ pub fn default_data_type ( ) -> & ' static DataType {
532+ T :: dtype ( )
533+ }
441534}
442535
443536pub type BinaryViewArray = BinaryViewArrayGeneric < [ u8 ] > ;
0 commit comments