Skip to content

Commit 410db4e

Browse files
committed
reduce mixing of span iterators
1 parent b173cd4 commit 410db4e

2 files changed

Lines changed: 19 additions & 21 deletions

File tree

cpp/src/arrow/compute/kernels/vector_array_sort.cc

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -79,16 +79,16 @@ struct PartitionNthToIndices {
7979
}
8080
const auto p = PartitionNullsAndNans<ArrayType, NonStablePartitioner>(
8181
out_span, arr, 0, options.null_placement);
82-
auto nth_begin = out_span.begin() + pivot;
83-
if (nth_begin >= p.non_null_like_range.begin() &&
84-
nth_begin < p.non_null_like_range.end()) {
85-
std::ranges::nth_element(
86-
p.non_null_like_range.begin(), nth_begin, p.non_null_like_range.end(),
87-
[&arr](uint64_t left, uint64_t right) {
88-
const auto lval = GetView::LogicalValue(arr.GetView(left));
89-
const auto rval = GetView::LogicalValue(arr.GetView(right));
90-
return lval < rval;
91-
});
82+
auto nth_begin = out_span.data() + pivot;
83+
auto non_null_begin = p.non_null_like_range.data();
84+
auto non_null_end = p.non_null_like_range.data() + p.non_null_like_range.size();
85+
if (nth_begin >= non_null_begin && nth_begin < non_null_end) {
86+
std::nth_element(non_null_begin, nth_begin, non_null_end,
87+
[&arr](uint64_t left, uint64_t right) {
88+
const auto lval = GetView::LogicalValue(arr.GetView(left));
89+
const auto rval = GetView::LogicalValue(arr.GetView(right));
90+
return lval < rval;
91+
});
9292
}
9393
return Status::OK();
9494
}
@@ -156,16 +156,14 @@ class ArrayCompareSorter {
156156
indices, values, offset, options.null_placement);
157157
if (options.order == SortOrder::Ascending) {
158158
std::ranges::stable_sort(
159-
p.non_null_like_range,
160-
[&values, &offset](uint64_t left, uint64_t right) {
159+
p.non_null_like_range, [&values, &offset](uint64_t left, uint64_t right) {
161160
const auto lhs = GetView::LogicalValue(values.GetView(left - offset));
162161
const auto rhs = GetView::LogicalValue(values.GetView(right - offset));
163162
return lhs < rhs;
164163
});
165164
} else {
166165
std::ranges::stable_sort(
167-
p.non_null_like_range,
168-
[&values, &offset](uint64_t left, uint64_t right) {
166+
p.non_null_like_range, [&values, &offset](uint64_t left, uint64_t right) {
169167
const auto lhs = GetView::LogicalValue(values.GetView(left - offset));
170168
const auto rhs = GetView::LogicalValue(values.GetView(right - offset));
171169
// We don't use 'left > right' here to reduce required operator.

cpp/src/arrow/compute/kernels/vector_sort_internal.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -320,14 +320,14 @@ struct ChunkedMergeImpl {
320320

321321
// Mutate the input, stably in two steps, to obtain the following layouts:
322322
// [left nul .. left nan .. right nul .. right nan .. left non-nul .. right non-nus]
323-
std::rotate(left.non_null_like_range.begin(), right.null_range.begin(),
324-
right.nan_range.end());
323+
std::rotate(left.non_null_like_range.data(), right.null_range.data(),
324+
right.nan_range.data() + right.nan_range.size());
325325

326326
// only use sizes of ranges that are at a different position now
327327
// [left nul .. right nul .. left nan .. right nan .. left non-nulls .. right
328328
// non-nulls] this is a no-op if no nan values are present
329-
std::rotate(left.nan_range.begin(), left.nan_range.begin() + left.nan_range.size(),
330-
left.nan_range.begin() + left.nan_range.size() + right.null_range.size());
329+
std::rotate(left.nan_range.data(), left.nan_range.data() + left.nan_range.size(),
330+
left.nan_range.data() + left.nan_range.size() + right.null_range.size());
331331

332332
std::span<CompressedChunkLocation> full_span{left.overall_begin(),
333333
right.overall_end()};
@@ -366,14 +366,14 @@ struct ChunkedMergeImpl {
366366

367367
// Mutate the input, stably in two steps, to obtain the following layouts:
368368
// [left non-nul .. right non-nul .. left nan .. left nul .. right nan .. right nul]
369-
std::rotate(left.nan_range.begin(), right.non_null_like_range.begin(),
370-
right.non_null_like_range.end());
369+
std::rotate(left.nan_range.data(), right.non_null_like_range.data(),
370+
right.non_null_like_range.data() + right.non_null_like_range.size());
371371

372372
// only use sizes of ranges that are at a different position now
373373
// [left non-nul .. right non-nul .. left nan .. left nul .. right nan .. right nul]
374374
// this is a no-op if no nan values are present
375375
auto new_left_null_range_begin =
376-
left.non_null_like_range.begin() + left.non_null_like_range.size() +
376+
left.non_null_like_range.data() + left.non_null_like_range.size() +
377377
right.non_null_like_range.size() + left.nan_range.size();
378378
std::rotate(
379379
new_left_null_range_begin, new_left_null_range_begin + left.null_range.size(),

0 commit comments

Comments
 (0)