3 ms·
fn genericReduceTypeErased( size: usize, total: [*]u8, list: []const u8, reducer: *const fn(total: [*]u8, current: [*]const u8)
by pfg_ 2y ago
fn genericReduceTypeErased(
size: usize,
total: [*]u8,
list: []const u8,
reducer: *const fn(total: [*]u8, current: [*]const u8) callconv(.C) void,
) void {
for(0..@divExact(list.len, size)) |i| {
const itm = &list[i \* size];
reducer(total, @ptrCast(itm));
}
}
inline fn genericReduce(
comptime T: type,
total: *T,
list: []const T,
reducer: *const fn(total: *T, current: *const T) callconv(.C) void,
) void {
genericReduceTypeErased( @sizeOf(T), @ptrCast(total), std.mem.sliceAsBytes(list), @ptrCast(reducer) );
}
The proposal is basically syntax sugar for making a typed version of the first function in C