11// SPDX-License-Identifier: Apache-2.0
22// SPDX-FileCopyrightText: Copyright the Vortex contributors
33
4- use std:: mem:: MaybeUninit ;
54use vortex_buffer:: { Buffer , BufferMut } ;
65use vortex_mask:: { Mask , MaskValues } ;
76
@@ -68,41 +67,39 @@ impl<T: Copy> Expand for &mut BufferMut<T> {
6867 Mask :: AllTrue ( _) => { }
6968 Mask :: AllFalse ( _) => { }
7069 Mask :: Values ( mask_values) => {
71- let buf_len = self . len ( ) ;
72- let mask_len = mask_values. len ( ) ;
73-
74- self . reserve ( mask_len - buf_len) ;
75-
76- // SAFETY: Sufficient capacity has been reserved.
77- unsafe { self . set_len ( mask_len) } ;
78-
79- let buf_slice = self . as_mut_slice ( ) ;
80- expand_inplace ( buf_slice, buf_len, mask_values) ;
70+ expand_inplace ( self , mask_values) ;
8171 }
8272 }
8373 }
8474}
8575
86- /// Scatters elements from a mutable slice into itself at positions marked true in the mask.
76+ /// Scatters elements from a mutable buffer into itself at positions marked true in the mask.
8777/// Used for in-place expansion where source and destination are the same buffer.
8878///
8979/// # Arguments
9080///
91- /// * `buf_slice` - The buffer slice to scatter into (already expanded to mask length)
92- /// * `src_len` - The original length of the buffer before expansion
81+ /// * `buf_mut` - The mutable buffer to expand in-place
9382/// * `mask_values` - The mask indicating where elements should be placed
94- fn expand_inplace < T : Copy > ( buf_slice : & mut [ T ] , src_len : usize , mask_values : & MaskValues ) {
95- let mask_len = buf_slice. len ( ) ;
83+ fn expand_inplace < T : Copy > ( buf_mut : & mut BufferMut < T > , mask_values : & MaskValues ) {
84+ let buf_len = buf_mut. len ( ) ;
85+ let mask_len = mask_values. len ( ) ;
86+
87+ buf_mut. reserve ( mask_len - buf_len) ;
88+
89+ // SAFETY: Sufficient capacity has been reserved.
90+ unsafe { buf_mut. set_len ( mask_len) } ;
91+
92+ let buf_slice = buf_mut. as_mut_slice ( ) ;
9693
9794 // Pick the first value as a default value. The buffer is not empty, and we
9895 // know that the first value is guaranteed to be initialized. By doing this
9996 // T does not require to implement `Default`.
10097 let pseudo_default_value = buf_slice[ 0 ] ;
10198
102- let mut element_idx = src_len ;
99+ let mut element_idx = buf_len ;
103100
104101 // Iterate backwards through the mask to avoid overwriting unprocessed elements.
105- for mask_idx in ( src_len ..mask_len) . rev ( ) {
102+ for mask_idx in ( buf_len ..mask_len) . rev ( ) {
106103 // NOTE(0ax1): .value is slow => optimize
107104 if mask_values. value ( mask_idx) {
108105 element_idx -= 1 ;
@@ -113,7 +110,7 @@ fn expand_inplace<T: Copy>(buf_slice: &mut [T], src_len: usize, mask_values: &Ma
113110 }
114111 }
115112
116- for mask_idx in ( 0 ..src_len ) . rev ( ) {
113+ for mask_idx in ( 0 ..buf_len ) . rev ( ) {
117114 if mask_values. value ( mask_idx) {
118115 element_idx -= 1 ;
119116 buf_slice[ mask_idx] = buf_slice[ element_idx] ;
0 commit comments