Zig 0.17.0-dev (Split by item)

This is an example of documentation generated by ZigDoc, an alternative to Zig's built-in Auto Doc feature. See also examples in other modes/formats. The project being documented here (as the example) is the Zig library itself.

reverse

In-place order reversal of a slice

mem.reverse
pub fn reverse(comptime T: type, items: []T) void

File

lib/std/mem.zig:3890

Code

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]);
    }
}