44use vortex_buffer:: { Buffer , BufferMut } ;
55use vortex_mask:: { Mask , MaskIter } ;
66
7- use crate :: filter:: Filter ;
7+ use crate :: filter:: { Filter , MaskIndices } ;
88
99// This is modeled after the constant with the equivalent name in arrow-rs.
1010const FILTER_SLICES_SELECTIVITY_THRESHOLD : f64 = 0.8 ;
1111
12- impl < T : Copy > Filter for & Buffer < T > {
12+ impl < T : Copy > Filter < Mask > for & Buffer < T > {
1313 type Output = Buffer < T > ;
1414
1515 fn filter ( self , selection_mask : & Mask ) -> Buffer < T > {
@@ -32,7 +32,15 @@ impl<T: Copy> Filter for &Buffer<T> {
3232 }
3333}
3434
35- impl < T : Copy > Filter for & mut BufferMut < T > {
35+ impl < T : Copy > Filter < MaskIndices < ' _ > > for & Buffer < T > {
36+ type Output = Buffer < T > ;
37+
38+ fn filter ( self , indices : & MaskIndices ) -> Buffer < T > {
39+ filter_indices ( self , indices)
40+ }
41+ }
42+
43+ impl < T : Copy > Filter < Mask > for & mut BufferMut < T > {
3644 type Output = ( ) ;
3745
3846 fn filter ( self , selection_mask : & Mask ) {
@@ -69,7 +77,19 @@ impl<T: Copy> Filter for &mut BufferMut<T> {
6977 }
7078}
7179
72- impl < T : Copy > Filter for Buffer < T > {
80+ impl < T : Copy > Filter < MaskIndices < ' _ > > for & mut BufferMut < T > {
81+ type Output = ( ) ;
82+
83+ fn filter ( self , indices : & MaskIndices ) -> Self :: Output {
84+ for ( write_index, & read_index) in indices. iter ( ) . enumerate ( ) {
85+ self [ write_index] = self [ read_index] ;
86+ }
87+
88+ self . truncate ( indices. len ( ) ) ;
89+ }
90+ }
91+
92+ impl < T : Copy > Filter < Mask > for Buffer < T > {
7393 type Output = Self ;
7494
7595 fn filter ( self , selection_mask : & Mask ) -> Self {
@@ -91,6 +111,20 @@ impl<T: Copy> Filter for Buffer<T> {
91111 }
92112}
93113
114+ impl < T : Copy > Filter < MaskIndices < ' _ > > for Buffer < T > {
115+ type Output = Self ;
116+
117+ fn filter ( self , indices : & MaskIndices < ' _ > ) -> Self {
118+ match self . try_into_mut ( ) {
119+ Ok ( mut buffer_mut) => {
120+ ( & mut buffer_mut) . filter ( indices) ;
121+ buffer_mut. freeze ( )
122+ }
123+ Err ( buffer) => ( & buffer) . filter ( indices) ,
124+ }
125+ }
126+ }
127+
94128fn filter_indices < T : Copy > ( values : & [ T ] , indices : & [ usize ] ) -> Buffer < T > {
95129 Buffer :: < T > :: from_trusted_len_iter ( indices. iter ( ) . map ( |& idx| values[ idx] ) )
96130}
0 commit comments