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.

compressSubtreeWide

blake3.compressSubtreeWide
fn compressSubtreeWide(input: []const u8, key: [8]u32, chunk_counter: u64, flags: Flags, out: []u8) usize

File

lib/std/crypto/blake3.zig:628

Code

fn compressSubtreeWide(input: []const u8, key: [8]u32, chunk_counter: u64, flags: Flags, out: []u8) usize {
    if (input.len <= max_simd_degree * chunk_length) {
        return compressChunksParallel(input, key, chunk_counter, flags, out);
    }

    const left_input_len = leftSubtreeLen(input.len);
    const right_input = input[left_input_len..];
    const right_chunk_counter = chunk_counter + @as(u64, left_input_len / chunk_length);

    var cv_array: [2 * max_simd_degree_or_2 * Blake3.digest_length]u8 = undefined;
    var degree: usize = max_simd_degree;
    if (left_input_len > chunk_length and degree == 1) {
        degree = 2;
    }
    const right_cvs = cv_array[degree * Blake3.digest_length ..];

    const left_n = compressSubtreeWide(input[0..left_input_len], key, chunk_counter, flags, cv_array[0..]);
    const right_n = compressSubtreeWide(right_input, key, right_chunk_counter, flags, right_cvs);

    if (left_n == 1) {
        @memcpy(out[0 .. 2 * Blake3.digest_length], cv_array[0 .. 2 * Blake3.digest_length]);
        return 2;
    }

    const num_chaining_values = left_n + right_n;
    return compressParentsParallel(&cv_array, num_chaining_values, key, flags, out);
}