DoxigAlpha

finalize

Function parameters

Parameters

#
unfinished:u32
byte_count:usize
partial:anytype

Type definitions in this namespace

Types

#

Source

Implementation

#
fn finalize(unfinished: u32, byte_count: usize, partial: anytype) u32 {
    std.debug.assert(partial.len < 16);
    var acc = unfinished +% @as(u32, @intCast(byte_count)) +% @as(u32, @intCast(partial.len));

    switch (partial.len) {
        inline 0, 1, 2, 3 => |count| {
            inline for (0..count) |i| acc = finalize1(acc, partial[i]);
            return avalanche(acc);
        },
        inline 4, 5, 6, 7 => |count| {
            acc = finalize4(acc, partial[0..4]);
            inline for (4..count) |i| acc = finalize1(acc, partial[i]);
            return avalanche(acc);
        },
        inline 8, 9, 10, 11 => |count| {
            acc = finalize4(acc, partial[0..4]);
            acc = finalize4(acc, partial[4..8]);
            inline for (8..count) |i| acc = finalize1(acc, partial[i]);
            return avalanche(acc);
        },
        inline 12, 13, 14, 15 => |count| {
            acc = finalize4(acc, partial[0..4]);
            acc = finalize4(acc, partial[4..8]);
            acc = finalize4(acc, partial[8..12]);
            inline for (12..count) |i| acc = finalize1(acc, partial[i]);
            return avalanche(acc);
        },
        else => unreachable,
    }

    return avalanche(acc);
}