In-place order reversal of a slice
pub fn reverse(comptime T: type, items: []T) void
pub fn reverse(comptime T: type, items: []T) void {
var i: usize = 0;
const end = items.len / 2;
vec: {
if (!use_vectors) break :vec;
if (@inComptime()) break :vec;
switch (@typeInfo(T)) {
.int, .float => {},
.pointer => |pointer| if (pointer.size == .slice) break :vec,
else => break :vec,
}
if (@bitSizeOf(T) == 0 or !comptime std.math.isPowerOfTwo(@bitSizeOf(T))) break :vec;
const simd_size = std.simd.suggestVectorLength(T) orelse break :vec;
if (simd_size > end) break :vec;
const simd_end = end - (simd_size - 1);
while (i < simd_end) : (i += simd_size) {
const left_slice = items[i .. i + simd_size];
const right_slice = items[items.len - i - simd_size .. items.len - i];
const left_shuffled: [simd_size]T = reverseVector(simd_size, T, left_slice);
const right_shuffled: [simd_size]T = reverseVector(simd_size, T, right_slice);
@memcpy(right_slice, &left_shuffled);
@memcpy(left_slice, &right_shuffled);
}
}
while (i < end) : (i += 1) {
swap(T, &items[i], &items[items.len - i - 1]);
}
}