@@ -2,7 +2,7 @@ use std::cmp::min;
22
33use arrow_buffer:: buffer:: BooleanBuffer ;
44use arrow_buffer:: BooleanBufferBuilder ;
5- use num_traits:: { AsPrimitive , FromPrimitive } ;
5+ use num_traits:: AsPrimitive ;
66use vortex_dtype:: NativePType ;
77use vortex_error:: { vortex_panic, VortexExpect as _} ;
88
@@ -35,12 +35,12 @@ pub fn runend_bool_encode_slice(elements: &BooleanBuffer) -> (Vec<u64>, bool) {
3535 ( ends, first_bool)
3636}
3737
38- pub fn runend_bool_decode_slice < E : NativePType + AsPrimitive < usize > + FromPrimitive + Ord > (
38+ #[ inline]
39+ pub fn trimmed_ends_iter < E : NativePType + AsPrimitive < usize > + Ord > (
3940 run_ends : & [ E ] ,
40- start : bool ,
4141 offset : usize ,
4242 length : usize ,
43- ) -> BooleanBuffer {
43+ ) -> impl Iterator < Item = usize > + use < ' _ , E > {
4444 let offset_e = E :: from_usize ( offset) . unwrap_or_else ( || {
4545 vortex_panic ! (
4646 "offset {} cannot be converted to {}" ,
@@ -55,14 +55,22 @@ pub fn runend_bool_decode_slice<E: NativePType + AsPrimitive<usize> + FromPrimit
5555 std:: any:: type_name:: <E >( )
5656 )
5757 } ) ;
58- let trimmed_ends = run_ends
58+ run_ends
5959 . iter ( )
60- . map ( |v| * v - offset_e)
61- . map ( |v| min ( v, length_e) ) ;
60+ . copied ( )
61+ . map ( move |v| v - offset_e)
62+ . map ( move |v| min ( v, length_e) )
63+ . map ( |v| v. as_ ( ) )
64+ }
6265
66+ pub fn runend_bool_decode_slice (
67+ run_ends_iter : impl Iterator < Item = usize > ,
68+ start : bool ,
69+ length : usize ,
70+ ) -> BooleanBuffer {
6371 let mut decoded = BooleanBufferBuilder :: new ( length) ;
64- for ( idx, end) in trimmed_ends . enumerate ( ) {
65- decoded. append_n ( end. as_ ( ) - decoded. len ( ) , value_at_index ( idx, start) ) ;
72+ for ( idx, end) in run_ends_iter . enumerate ( ) {
73+ decoded. append_n ( end - decoded. len ( ) , value_at_index ( idx, start) ) ;
6674 }
6775 BooleanBuffer :: from ( decoded)
6876}
@@ -78,7 +86,7 @@ mod test {
7886 use vortex_array:: validity:: Validity ;
7987 use vortex_array:: IntoArrayVariant ;
8088
81- use crate :: compress:: { runend_bool_decode_slice, runend_bool_encode_slice} ;
89+ use crate :: compress:: { runend_bool_decode_slice, runend_bool_encode_slice, trimmed_ends_iter } ;
8290 use crate :: decode_runend_bool;
8391
8492 #[ test]
@@ -107,27 +115,30 @@ mod test {
107115 fn encode_decode_bool ( ) {
108116 let input = [ true , true , false , true , true , false ] ;
109117 let ( ends, start) = runend_bool_encode_slice ( & BooleanBuffer :: from ( input. as_slice ( ) ) ) ;
118+ let ends_iter = trimmed_ends_iter ( ends. as_slice ( ) , 0 , input. len ( ) ) ;
110119
111- let decoded = runend_bool_decode_slice ( ends . as_slice ( ) , start, 0 , input. len ( ) ) ;
120+ let decoded = runend_bool_decode_slice ( ends_iter , start, input. len ( ) ) ;
112121 assert_eq ! ( decoded, BooleanBuffer :: from( input. as_slice( ) ) )
113122 }
114123
115124 #[ test]
116125 fn encode_decode_bool_false_start ( ) {
117126 let input = [ false , false , true , true , false , true , true , false ] ;
118127 let ( ends, start) = runend_bool_encode_slice ( & BooleanBuffer :: from ( input. as_slice ( ) ) ) ;
128+ let ends_iter = trimmed_ends_iter ( ends. as_slice ( ) , 0 , input. len ( ) ) ;
119129
120- let decoded = runend_bool_decode_slice ( ends . as_slice ( ) , start, 0 , input. len ( ) ) ;
130+ let decoded = runend_bool_decode_slice ( ends_iter , start, input. len ( ) ) ;
121131 assert_eq ! ( decoded, BooleanBuffer :: from( input. as_slice( ) ) )
122132 }
123133
124134 #[ test]
125135 fn encode_decode_bool_false_start_long ( ) {
126- let input = vec ! [ true ; 1024 ] ;
127- // input.extend([false, true, false, true].as_slice());
136+ let mut input = vec ! [ true ; 1024 ] ;
137+ input. extend ( [ false , true , false , true ] . as_slice ( ) ) ;
128138 let ( ends, start) = runend_bool_encode_slice ( & BooleanBuffer :: from ( input. as_slice ( ) ) ) ;
139+ let ends_iter = trimmed_ends_iter ( ends. as_slice ( ) , 0 , input. len ( ) ) ;
129140
130- let decoded = runend_bool_decode_slice ( ends . as_slice ( ) , start, 0 , input. len ( ) ) ;
141+ let decoded = runend_bool_decode_slice ( ends_iter , start, input. len ( ) ) ;
131142 assert_eq ! ( decoded, BooleanBuffer :: from( input. as_slice( ) ) )
132143 }
133144
@@ -136,8 +147,9 @@ mod test {
136147 let mut rng = StdRng :: seed_from_u64 ( 4352 ) ;
137148 let input = ( 0 ..1024 * 4 ) . map ( |_x| rng. gen :: < bool > ( ) ) . collect_vec ( ) ;
138149 let ( ends, start) = runend_bool_encode_slice ( & BooleanBuffer :: from ( input. as_slice ( ) ) ) ;
150+ let ends_iter = trimmed_ends_iter ( ends. as_slice ( ) , 0 , input. len ( ) ) ;
139151
140- let decoded = runend_bool_decode_slice ( ends . as_slice ( ) , start, 0 , input. len ( ) ) ;
152+ let decoded = runend_bool_decode_slice ( ends_iter , start, input. len ( ) ) ;
141153 assert_eq ! ( decoded, BooleanBuffer :: from( input. as_slice( ) ) )
142154 }
143155
0 commit comments