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/ › treap.zig › SliceIterRandomOrder
SliceIterRandomOrder
treap.SliceIterRandomOrder
fn SliceIterRandomOrder (comptime T : type ) type
File
Code
fn SliceIterRandomOrder (comptime T : type ) type {
return struct {
rng : std .Random ,
slice : []T ,
index : usize = undefined ,
offset : usize = undefined ,
co_prime : usize ,
const Self = @This ();
pub fn init (slice : []T , rng : std .Random ) Self {
return Self {
.rng = rng ,
.slice = slice ,
.co_prime = blk : {
if (slice .len == 0 ) break :blk 0 ;
var prime = slice .len / 2 ;
while (prime < slice .len ) : (prime += 1 ) {
var gcd = [_ ]usize { prime , slice .len };
while (gcd [1 ] != 0 ) {
const temp = gcd ;
gcd = [_ ]usize { temp [1 ], temp [0 ] % temp [1 ] };
}
if (gcd [0 ] == 1 ) break ;
}
break :blk prime ;
},
};
}
pub fn reset (self : *Self ) void {
self .index = 0 ;
self .offset = self .rng .int (usize );
}
pub fn next (self : *Self ) ?*T {
if (self .index >= self .slice .len ) return null ;
defer self .index += 1 ;
return &self .slice [((self .index *% self .co_prime ) +% self .offset ) % self .slice .len ];
}
};
}