From 6637f7a8d19e56f0d9bfb5cbceabf51774e140e9 Mon Sep 17 00:00:00 2001 From: Meghan Date: Thu, 11 May 2023 23:21:16 -0700 Subject: [PATCH 1/2] std: add mem.SplitIterator.peek() --- lib/std/mem.zig | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/std/mem.zig b/lib/std/mem.zig index aae5c1b617d2..f05c3da43c16 100644 --- a/lib/std/mem.zig +++ b/lib/std/mem.zig @@ -2038,15 +2038,18 @@ test "split" { try testing.expectEqualSlices(u8, it.first(), "abc"); try testing.expectEqualSlices(u8, it.rest(), "def||ghi"); + try testing.expectEqualSlices(u8, it.peek().?, "def"); try testing.expectEqualSlices(u8, it.next().?, "def"); try testing.expectEqualSlices(u8, it.rest(), "|ghi"); try testing.expectEqualSlices(u8, it.next().?, ""); try testing.expectEqualSlices(u8, it.rest(), "ghi"); + try testing.expectEqualSlices(u8, it.peek().?, "ghi"); try testing.expectEqualSlices(u8, it.next().?, "ghi"); try testing.expectEqualSlices(u8, it.rest(), ""); + try testing.expect(it.peek() == null); try testing.expect(it.next() == null); it = split(u8, "", "|"); @@ -2056,6 +2059,7 @@ test "split" { it = split(u8, "|", "|"); try testing.expectEqualSlices(u8, it.first(), ""); try testing.expectEqualSlices(u8, it.next().?, ""); + try testing.expect(it.peek() == null); try testing.expect(it.next() == null); it = split(u8, "hello", " "); @@ -2467,6 +2471,14 @@ pub fn SplitIterator(comptime T: type) type { return self.buffer[start..end]; } + /// Returns a slice of the next field, or null if splitting is complete. + /// This method does not alter self.index. + pub fn peek(self: *Self) ?[]const T { + const start = self.index orelse return null; + const end = if (indexOfPos(T, self.buffer, start, self.delimiter)) |delim_start| delim_start else self.buffer.len; + return self.buffer[start..end]; + } + /// Returns a slice of the remaining bytes. Does not affect iterator state. pub fn rest(self: Self) []const T { const end = self.buffer.len; From c2a846a62cefbade59875e43bb9dd38820663a08 Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Fri, 23 Jun 2023 13:08:30 -0700 Subject: [PATCH 2/2] std.mem.peek: use the proper indexOf --- lib/std/mem.zig | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/std/mem.zig b/lib/std/mem.zig index ca6e2c9e88c8..589a4ceb1863 100644 --- a/lib/std/mem.zig +++ b/lib/std/mem.zig @@ -2861,7 +2861,11 @@ pub fn SplitIterator(comptime T: type, comptime delimiter_type: DelimiterType) t /// This method does not alter self.index. pub fn peek(self: *Self) ?[]const T { const start = self.index orelse return null; - const end = if (indexOfPos(T, self.buffer, start, self.delimiter)) |delim_start| delim_start else self.buffer.len; + const end = if (switch (delimiter_type) { + .sequence => indexOfPos(T, self.buffer, start, self.delimiter), + .any => indexOfAnyPos(T, self.buffer, start, self.delimiter), + .scalar => indexOfScalarPos(T, self.buffer, start, self.delimiter), + }) |delim_start| delim_start else self.buffer.len; return self.buffer[start..end]; }