Skip to content

Commit 0f17b76

Browse files
committed
Fmt
1 parent b429fc1 commit 0f17b76

1 file changed

Lines changed: 33 additions & 14 deletions

File tree

arrow-select/src/coalesce/byte_view.rs

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -250,29 +250,48 @@ impl<B: ByteViewType> InProgressByteViewArray<B> {
250250
);
251251
}
252252

253-
// Copy the views, updating the buffer index and copying the data as needed
254-
let new_views = views.iter().map(|v| {
255-
let mut b: ByteView = ByteView::from(*v);
253+
// Single-pass: rewrite views and copy string data together.
254+
// Uses a manual loop with raw pointers so all state lives in
255+
// registers (no closure captures that force reloads).
256+
let dst_ptr = dst_buffer.as_mut_ptr();
257+
let mut dst_len = dst_buffer.len();
258+
259+
let views_ptr = self.views.as_mut_ptr();
260+
let mut views_len = self.views.len();
261+
self.views.reserve(views.len());
262+
263+
for v in views {
264+
let mut b = ByteView::from(*v);
256265
if b.length > MAX_INLINE_VIEW_LEN {
257266
let buffer_index = b.buffer_index as usize;
258267
let buffer_offset = b.offset as usize;
259268
let str_len = b.length as usize;
260269

261-
// Update view to location in current
262-
b.offset = dst_buffer.len() as u32;
270+
b.offset = dst_len as u32;
263271
b.buffer_index = new_buffer_index;
264272

265-
// safety: input views are validly constructed
266-
let src = unsafe {
267-
buffers
273+
// safety: input views are validly constructed and
274+
// dst_buffer has sufficient capacity
275+
unsafe {
276+
let src_ptr = buffers
268277
.get_unchecked(buffer_index)
269-
.get_unchecked(buffer_offset..buffer_offset + str_len)
270-
};
271-
dst_buffer.extend_from_slice(src);
278+
.as_ptr()
279+
.add(buffer_offset);
280+
std::ptr::copy_nonoverlapping(src_ptr, dst_ptr.add(dst_len), str_len);
281+
}
282+
dst_len += str_len;
283+
}
284+
// Safety: we reserved capacity above
285+
unsafe {
286+
views_ptr.add(views_len).write(b.as_u128());
272287
}
273-
b.as_u128()
274-
});
275-
self.views.extend(new_views);
288+
views_len += 1;
289+
}
290+
291+
unsafe {
292+
self.views.set_len(views_len);
293+
dst_buffer.set_len(dst_len);
294+
}
276295
self.current = Some(dst_buffer);
277296
}
278297
}

0 commit comments

Comments
 (0)