From 5059384b570a4cb554215c8091ff00d77a0ebadf Mon Sep 17 00:00:00 2001 From: Ryan Liptak Date: Tue, 4 Oct 2022 23:24:19 -0700 Subject: [PATCH] Introduce IterableDir.iterateAssumeFirstIteration This allows for avoiding an unnecessary lseek (or equivalent) call in places where it can be known that the fd has not had its cursor modified yet. --- lib/std/fs.zig | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/lib/std/fs.zig b/lib/std/fs.zig index b1e88d2e01..effa07a2ac 100644 --- a/lib/std/fs.zig +++ b/lib/std/fs.zig @@ -811,6 +811,17 @@ pub const IterableDir = struct { }; pub fn iterate(self: IterableDir) Iterator { + return self.iterateImpl(true); + } + + /// Like `iterate`, but will not reset the directory cursor before the first + /// iteration. This should only be used in cases where it is known that the + /// `IterableDir` has not had its cursor modified yet (e.g. it was just opened). + pub fn iterateAssumeFirstIteration(self: IterableDir) Iterator { + return self.iterateImpl(false); + } + + fn iterateImpl(self: IterableDir, first_iter_start_value: bool) Iterator { switch (builtin.os.tag) { .macos, .ios, @@ -825,20 +836,20 @@ pub const IterableDir = struct { .index = 0, .end_index = 0, .buf = undefined, - .first_iter = true, + .first_iter = first_iter_start_value, }, .linux, .haiku => return Iterator{ .dir = self.dir, .index = 0, .end_index = 0, .buf = undefined, - .first_iter = true, + .first_iter = first_iter_start_value, }, .windows => return Iterator{ .dir = self.dir, .index = 0, .end_index = 0, - .first_iter = true, + .first_iter = first_iter_start_value, .buf = undefined, .name_data = undefined, },