Skip to content

Commit 1adea67

Browse files
committed
move logic into expand_inplace
Signed-off-by: Alexander Droste <[email protected]>
1 parent 1bcacc5 commit 1adea67

File tree

1 file changed

+16
-19
lines changed

1 file changed

+16
-19
lines changed

vortex-compute/src/expand/buffer.rs

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// SPDX-License-Identifier: Apache-2.0
22
// SPDX-FileCopyrightText: Copyright the Vortex contributors
33

4-
use std::mem::MaybeUninit;
54
use vortex_buffer::{Buffer, BufferMut};
65
use 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

Comments
 (0)