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.
Zig › std/ › hash/ › crc.zig › Generic
Generic
crc.Generic
pub fn Generic (comptime W : type , comptime algorithm : Algorithm (W )) type
File
Code
pub fn Generic (comptime W : type , comptime algorithm : Algorithm (W )) type {
return struct {
const Self = @This ();
const I = if (@bitSizeOf (W ) < 8 ) u8 else W ;
const lookup_table = blk : {
@setEvalBranchQuota (2500 );
const poly = reflect (algorithm .polynomial );
var table : [256 ]I = undefined ;
for (&table , 0 ..) |*e , i | {
var crc : I = i ;
if (algorithm .reflect_input ) {
var j : usize = 0 ;
while (j < 8 ) : (j += 1 ) {
crc = (crc >> 1 ) ^ ((crc & 1 ) * poly );
}
} else {
crc <<= @bitSizeOf (I ) - 8 ;
var j : usize = 0 ;
while (j < 8 ) : (j += 1 ) {
crc = (crc << 1 ) ^ (((crc >> (@bitSizeOf (I ) - 1 )) & 1 ) * poly );
}
}
e .* = crc ;
}
break :blk table ;
};
crc : I ,
pub fn init () Self {
const initial = reflect (algorithm .initial );
return .{ .crc = initial };
}
inline fn tableEntry (index : I ) I {
const short : u8 = @truncate (index );
return lookup_table [short ];
}
pub fn update (self : *Self , bytes : []const u8 ) void {
var i : usize = 0 ;
if (@bitSizeOf (I ) <= 8 ) {
while (i < bytes .len ) : (i += 1 ) {
self .crc = tableEntry (self .crc ^ bytes [i ]);
}
} else if (algorithm .reflect_input ) {
while (i < bytes .len ) : (i += 1 ) {
const table_index = self .crc ^ bytes [i ];
self .crc = tableEntry (table_index ) ^ (self .crc >> 8 );
}
} else {
while (i < bytes .len ) : (i += 1 ) {
const table_index = (self .crc >> (@bitSizeOf (I ) - 8 )) ^ bytes [i ];
self .crc = tableEntry (table_index ) ^ (self .crc << 8 );
}
}
}
pub fn final (self : Self ) W {
var c = self .crc ;
if (algorithm .reflect_input != algorithm .reflect_output ) {
c = @bitReverse (c );
}
if (!algorithm .reflect_output ) {
c >>= @bitSizeOf (I ) - @bitSizeOf (W );
}
return @intCast (c ^ algorithm .xor_output );
}
pub fn hash (bytes : []const u8 ) W {
var c = Self .init ();
c .update (bytes );
return c .final ();
}
fn reflect (x : I ) I {
const offset = @bitSizeOf (I ) - @bitSizeOf (W );
if (algorithm .reflect_input )
return @bitReverse (x ) >> offset
else
return x << offset ;
}
};
}