feature. See also
. The project being documented here (as the example) is the Zig library itself.
Dir.Reader
pub const Reader = struct
File
Code
pub const Reader = struct {
dir: Dir,
state: State,
buffer: []align(@alignOf(usize)) u8,
index: usize,
end: usize,
pub const min_buffer_len = switch (native_os) {
.linux => std.mem.alignForward(usize, @sizeOf(std.os.linux.dirent64), 8) +
std.mem.alignForward(usize, max_name_bytes, 8),
.windows => len: {
const max_info_len = @sizeOf(std.os.windows.FILE_BOTH_DIR_INFORMATION) + std.os.windows.NAME_MAX * 2;
const info_align = @alignOf(std.os.windows.FILE_BOTH_DIR_INFORMATION);
const reserved_len = std.mem.alignForward(usize, max_name_bytes, info_align) - max_info_len;
break :len std.mem.alignForward(usize, reserved_len, info_align) + max_info_len;
},
.wasi => @sizeOf(std.os.wasi.dirent_t) +
std.mem.alignForward(usize, max_name_bytes, @alignOf(std.os.wasi.dirent_t)),
.openbsd => std.c.S.BLKSIZE,
else => if (builtin.link_libc) @sizeOf(std.c.dirent) else std.mem.alignForward(usize, max_name_bytes, @alignOf(usize)),
};
pub const State = enum {
reset,
reading,
finished,
};
pub const Error = error{
AccessDenied,
PermissionDenied,
SystemResources,
} || Io.UnexpectedError || Io.Cancelable;
pub fn init(dir: Dir, buffer: []align(@alignOf(usize)) u8) Reader {
assert(buffer.len >= min_buffer_len);
return .{
.dir = dir,
.state = .reset,
.index = 0,
.end = 0,
.buffer = buffer,
};
}
pub fn read(r: *Reader, io: Io, buffer: []Entry) Error!usize {
return io.vtable.dirRead(io.userdata, r, buffer);
}
pub fn next(r: *Reader, io: Io) Error!?Entry {
var buffer: [1]Entry = undefined;
while (true) {
const n = try read(r, io, &buffer);
if (n == 1) return buffer[0];
if (r.state == .finished) return null;
}
}
pub fn reset(r: *Reader) void {
r.state = .reset;
r.index = 0;
r.end = 0;
}
}