From cd0594e4a6a8449e3c1c9da5130a4252869e627c Mon Sep 17 00:00:00 2001 From: Meghan Date: Mon, 10 Jul 2023 11:34:39 -0700 Subject: [PATCH] std: add mem.SplitIterator.peek() (#15670) --- lib/std/mem.zig | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/std/mem.zig b/lib/std/mem.zig index 13152496b3..86f793ee56 100644 --- a/lib/std/mem.zig +++ b/lib/std/mem.zig @@ -2241,15 +2241,18 @@ test "splitScalar" { 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 = splitScalar(u8, "", '|'); @@ -2259,6 +2262,7 @@ test "splitScalar" { it = splitScalar(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 = splitScalar(u8, "hello", ' '); @@ -2865,6 +2869,18 @@ pub fn SplitIterator(comptime T: type, comptime delimiter_type: DelimiterType) t 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 (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]; + } + /// Returns a slice of the remaining bytes. Does not affect iterator state. pub fn rest(self: Self) []const T { const end = self.buffer.len;