feature. See also
. The project being documented here (as the example) is the Zig library itself.
stdlib.qsort_r
fn qsort_r(base: *anyopaque, n: usize, size: usize, compare: *const fn (a: *const anyopaque, b: *const anyopaque, arg: ?*anyopaque) callconv(.c) c_int, arg: ?*anyopaque) callconv(.c) void
File
Code
fn qsort_r(base: *anyopaque, n: usize, size: usize, compare: *const fn (a: *const anyopaque, b: *const anyopaque, arg: ?*anyopaque) callconv(.c) c_int, arg: ?*anyopaque) callconv(.c) void {
const Context = struct {
base: [*]u8,
size: usize,
compare: *const fn (a: *const anyopaque, b: *const anyopaque, arg: ?*anyopaque) callconv(.c) c_int,
arg: ?*anyopaque,
pub fn lessThan(ctx: @This(), a: usize, b: usize) bool {
return ctx.compare(&ctx.base[a * ctx.size], &ctx.base[b * ctx.size], ctx.arg) < 0;
}
pub fn swap(ctx: @This(), a: usize, b: usize) void {
const a_bytes: []u8 = ctx.base[a * ctx.size ..][0..ctx.size];
const b_bytes: []u8 = ctx.base[b * ctx.size ..][0..ctx.size];
for (a_bytes, b_bytes) |*ab, *bb| {
const tmp = ab.*;
ab.* = bb.*;
bb.* = tmp;
}
}
};
std.mem.sortUnstableContext(0, n, Context{
.base = @ptrCast(base),
.size = size,
.compare = compare,
.arg = arg,
});
}